Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate createSqlQuery设置变量_Java_Mysql_Sql_Hibernate - Fatal编程技术网

Java Hibernate createSqlQuery设置变量

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到

我有一个类似这样的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到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变量