如何使用setMaxResults更新hibernate查询?

时间:2012-09-05 15:25:14

标签: 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.setParameter("ctrl2", 5);

我通过setMaxResults(2)只询问前两个更新,他会更新所有记录,因为我做错了什么?谢谢你的帮助

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

5 个答案:

答案 0 :(得分:2)

这个答案是发布延迟,但对于使用HQL限制在DB中查找更新行数的其他用户可能会有所帮助

  不幸的是,setMaxResults()不能正常更新和删除hibernate   查询。它只适用于选择标准。

根据HQL,没有可用的特定解决方案,您希望更新具有限制数量的行,然后按照以下步骤进行操作

  1. 编写HQL以选择条件或范围为
    的所有行 setMaxResults。它将返回一个带有限制的List对象。
  2. 然后更新特定属性(您要更新的属性)和 通过session.update()方法再次存储这些行的对象。
  3. 我假设带有地图数据库类的表名,并且有两个变量 ctrl floop 带有getter和setter( < em>根据您的问题

                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();
    

答案 1 :(得分:1)

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

如果只想更新一组有限的行,则应在where条件中指定这些行。设置更新行数的硬限制没有多大意义,因为无法确定哪些行会更新。

答案 2 :(得分:1)

query.setMaxResults(2);将用于selection次查询,insertion/updation将被忽略。如果您将其用于selection个查询,那么您将在结果中获得2条记录。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我可以看到许多完全有效的用例,你只想更新有限数量的行,而其他人已经回答过,Hibernate Query无法解决这个问题,所以你需要求助于本机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模型中的名称。