Java 如何使用setMaxResults更新hibernate查询?

Java 如何使用setMaxResults更新hibernate查询?,java,hibernate,Java,Hibernate,我希望这是适当的部分,我有这个代码的问题 Transaction transaction = session.beginTransaction(); Query query = session.createQuery("update database set floop= :ctrl1" +" where ctrl= :ctrl2 ").setMaxResults(2); query.setMaxResults(2); query.setParameter("ctrl1",3); query

我希望这是适当的部分,我有这个代码的问题

Transaction transaction = session.beginTransaction(); 
Query query = session.createQuery("update database set floop= :ctrl1" +" where ctrl= :ctrl2 ").setMaxResults(2); 
query.setMaxResults(2);
query.setParameter("ctrl1",3);
query.setParameter("ctrl2", 5);
我通过
setMaxResults(2)
要求只对前两个记录进行更新,他会像我一样对所有记录进行更新,有什么不对??谢谢你的帮助


我本想使用session.createSQLQuery,但我不知道怎么做。

setMaxResults
限制查询返回的结果数,而不是受影响的行数


如果只想更新有限的行集,则应在where条件中指定这些行。对更新的行数设置硬限制没有多大意义,因为无法判断哪些行将被更新。

query.setMaxResults(2)
将用于
选择
查询,并将被
插入/更新
忽略。如果您将其用于
选择
查询,那么您将在结果中获得2条记录。

setMaxResults
仅适用于
选择
。对于您的问题,我将执行
选择
查询,然后使用
查询。setMaxResults(2)
,这将返回最多2个元素的列表。然后循环返回的列表,并对返回的一个或两个元素使用session.update。

我可以看到一些非常有效的用例,其中您只想更新有限数量的行,而其他行已经回答了,Hibernate查询无法处理这一问题,因此您需要求助于本机SQL

您没有在问题中指定使用哪种类型的数据库,因此此答案仅适用于MySql:

Transaction transaction = session.beginTransaction(); 
Query query = session.createSQLQuery("UPDATE database SET floop= :ctrl1 WHERE ctrl= :ctrl2 LIMIT :max"); 
query.setParameter("ctrl1",3);
query.setParameter("ctrl2", 5);
query.setParameter("max", 2);

请注意,上面的sql查询需要使用本机表名和列名,而不是ORM模型中的表名和列名。

此答案是发布延迟,但对于使用HQL查看更新数据库行数限制的其他用户可能会有所帮助

不幸的是setMaxResults()不工作更新和删除hibernate 查询它仅适用于选择标准

根据HQL,没有可用的特定解决方案,您希望使用限制数更新行,然后执行以下步骤

  • 编写一个HQL,用
    setMaxResults。它将返回一个有限制的列表对象
  • 然后更新特定属性(要更新的属性)并 通过session.update()方法再次存储这些行的对象
  • 我假设tablename带有map数据库类,有两个变量ctrlfloop,带有getter和setter(根据您的问题

    List List=new ArrayList();
    事务=会话。beginTransaction();
    //使用setMaxResults()获取限制为2的记录
    int setlimit=2;
    字符串hql_query=“from Database where ctrl=:ctrl2”;
    查询select\u Query=session.createQuery(hql\u Query).setMaxResults(setlimit);
    选择_query.setParameter(“ctrl2”,5);
    list=选择_query.list();
    //迭代列表并将新值设置为particuler列或属性
    int结果;
    如果(列表!=null){
    for(数据库元素:列表){
    元素。setFloop(ctrl1);
    //下面是更新数据库中的数据
    更新(要素);
    }
    结果=list.size();
    }否则{
    结果=0;
    }
    System.out.println(“受影响的行:+结果”);
    commit();
    
    您不能使用
    令牌处于限制中…..您将得到错误
    org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:第1行附近的限制
    如果使用本机SQL,我已成功使用:hibernate中的令牌处于限制中。您的错误消息表明您可能尝试了HQL,在这种情况下,不允许使用LIMIT关键字。本机sql查询可以正常工作,但它是依赖于mysql的查询,并且是hibernate中用户询问的问题,因此建议使用HQL更新查询。您的代码也可以工作。谢谢
                List<Database> list = new ArrayList<>();
                Transaction transaction = session.beginTransaction(); 
    
                //Fetching record with limit 2 using setMaxResults()
                int setlimit = 2;
                String hql_query = "from Database where ctrl = :ctrl2";
                Query select_query = session.createQuery(hql_query).setMaxResults(setlimit);
                select_query.setParameter("ctrl2", 5);
                list = select_query.list();
    
                //iterating list and setting new value to particuler column or property
                int result;
                if (list != null) {
                    for (Database element : list) {
                        element.setFloop(ctrl1);
                        //Here is updating data in database
                        session.update(element);
                    }
                    result = list.size();
                } else {
                    result = 0;
                }
                System.out.println("Rows affected: " + result);
    
                transaction.commit();