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,没有可用的特定解决方案,您希望使用限制数更新行,然后执行以下步骤
setMaxResults。它将返回一个有限制的列表对象
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();