我希望它是相应的部分,我对此代码有疑问
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
,但我不知道该怎么做。
答案 0 :(得分:2)
这个答案是发布延迟,但对于使用HQL限制在DB中查找更新行数的其他用户可能会有所帮助
不幸的是,setMaxResults()不能正常更新和删除hibernate 查询。它只适用于选择标准。
根据HQL,没有可用的特定解决方案,您希望更新具有限制数量的行,然后按照以下步骤进行操作
我假设带有地图数据库类的表名,并且有两个变量 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模型中的名称。