6

我希望这是适当的部分,我对这段代码有疑问

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,但我不知道怎么做。

4

5 回答 5

2

这个答案是发布延迟,但它可以帮助其他用户在使用 HQL 的情况下查看数据库中的更新行数

不幸的是 setMaxResults() 不能更新和删除休眠查询。它仅适用于选择标准。

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


  1. 编写一个 HQL 以使用setMaxResults选择具有条件或范围的所有行。它将返回一个有限制的 List 对象。
  2. 然后通过 session.update() 方法更新特定属性(要更新的属性)并再次存储这些行的对象。

我假设 tablename 与 map Database类,并且有两个变量ctrlfloop与 getter 和 setter (根据你的问题

            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();
于 2018-05-16T12:34:38.077 回答
1

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

于 2012-09-05T15:37:18.380 回答
1

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

当您只想更新一组有限的行时,您应该在 where 条件中指定这些行。对更新的行数设置硬性限制没有多大意义,因为无法判断哪些行将被更新。

于 2012-09-05T15:29:49.750 回答
0

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

于 2015-08-06T07:40:53.320 回答
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 模型中的。

于 2016-11-11T16:08:37.727 回答