Java Hibernate createSqlQuery设置变量
我有一个类似这样的mysql查询来获取行号Java Hibernate createSqlQuery设置变量,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我有一个类似这样的mysql查询来获取行号 set @rank = 0; select @rank := @rank + 1 as rank,id,name from test 在hibernate 3中,“:=”是一个问题 session.createSQLQuery("set @rank = 0; select @rank := @rank + 1 as rank,id,name from test"); 我切换到Hibernate3到
set @rank = 0;
select @rank := @rank + 1 as rank,id,name from test
在hibernate 3中,“:=”是一个问题
session.createSQLQuery("set @rank = 0;
select @rank := @rank + 1 as rank,id,name from test");
我切换到Hibernate3到4,并使用转义字符
session.createSQLQuery("set @rank = 0;
select @rank \\:= @rank + 1 as rank,id,name from test");
现在发生了另一个异常。它给出了例外情况:
"Parameter rank does not exist as a named parameter"
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near ':= 0 + 1 as rank,id,
name from test' at line 1
我试过这个:
session.createSQLQuery("select :rank \\:= :rank + 1 as rank,
ID,NAME,SURNAME from test").setInteger("rank", 0)
这一次,它给出了以下例外情况:
"Parameter rank does not exist as a named parameter"
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near ':= 0 + 1 as rank,id,
name from test' at line 1
知道如何解决这个问题吗?Hibernate不支持特定于数据库的SQL语法或SQL局部变量 据我所见,您甚至不想选择某个实体,因此您只需要一个聚合查询:
select count(t), t.id, t.name
from Test t
group by t.id, t.name
假设您有一个映射到测试表的测试实体。使用doReturningWork时,您可以访问普通JDBC连接。 然后,应将SQL拆分为2个执行集,并选择:
final Object queryResultObject = session.doReturningWork(new ReturningWork<ReturnObjectType>() {
@Override
public ReturnObjectType execute(Connection connection) throws SQLException {
final Statement statement = connection.createStatement();
statement.execute("set @rank = 0");
final ResultSet resultSet = statement.executeQuery(
"select @rank := @rank + 1 as rank,id,name
from test");
ReturnObjectType result = /* transform ResultSet into return value */
return result;
}
});
您确定不能在hibernate中使用局部变量吗?这很可悲。你总是可以使用原生SQL,即使是Hibernate,所以你可以试试。我不明白你的意思。我想我在createSQLQuery中使用了本机SQL。请您解释一下您的评论好吗?检查以访问当前连接,在那里您可以编写普通的旧JDBC。我尝试了doReturningWork仍然不允许我使用本地sql变量