gpt4 book ai didi

java - Hibernate 查询没有返回正确的值

转载 作者:行者123 更新时间:2023-11-30 07:13:34 25 4
gpt4 key购买 nike

所以在我的数据库中,我有 3 行,其中两行的 defaultFlag 为 0,一行设置为 1,现在在我的处理过程中,我正在将一个对象的 defaultProperty 从 0 更新为 1,但尚未保存该对象。

在保存之前,我需要查询数据库并查找是否有任何行设置了 defaultFlag,只有 1 个默认设置。

所以在执行更新之前,我正在运行查询以查找是否设置了默认值并且我得到了 2 个值,请注意这里如果我去检查数据库然后只有 1 行设置了默认值但是查询给了我两个结果因为这个。对象默认属性已从 0 更改为 1,但请注意该对象尚未保存在数据库中。

我真的很困惑为什么当数据库中有一行设置了默认值和默认属性已更改但未保存的其他对象时,hibernate 查询返回 2。

任何想法都会有所帮助。如果需要,我可以提供查询。

更新

根据建议,我在运行查询之前添加了 session.clear() 。

session.clear();
String sql = "SELECT * FROM BANKACCOUNTS WHERE PARTYID = :partyId AND CURRENCYID = :currencySymbol AND ISDEFAULTBANKACCOUNT= :defaultbankAccount";
SQLQuery q = session.createSQLQuery(sql);
q.addEntity(BankAccount.class);
q.setParameter("partyId", partyId);
q.setParameter("currencySymbol", currencySymbol);
q.setParameter("defaultbankAccount", 1);
return q.uniqueResult();

它按预期在结果中返回 1 行,但现在正在获取

嵌套异常是 org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与 session 异常相关联

最佳答案

要么查询在开始更改之前设置了“默认标志”的行,要么查询设置了默认标志的行的 列表并清除除您要设置的一个。

非常简单,停止使用您的“脆弱”当前方法,这种方法会在并发或数据处于不一致状态时崩溃。请改用可靠的方法,它将始终将数据设置为有效状态。

protected void makeAccountDefault (BankAccount acc) {

// find & clear any existing 'Default Accounts', other than specified.
//
String sql = "SELECT * FROM BANKACCOUNTS WHERE PARTYID = :partyId AND CURRENCYID = :currencySymbol AND ISDEFAULTBANKACCOUNT= :defaultbankAccount";
SQLQuery q = session.createSQLQuery(sql);
q.addEntity(BankAccount.class);
q.setParameter("partyId", partyId);
q.setParameter("currencySymbol", currencySymbol);
q.setParameter("defaultbankAccount", 1);
//
List<BackAccount> existingDefaults = q.list();
for (BankAccount existing : existingDefaults) {
if (! existing.equals( acc))
existing.setDefaultBankAccount( false);
}

// set the specified Account as Default.
acc.setDefaultBankAccount( true);

// done.
}

这就是您编写正确代码的方式,代码简单可靠。永远不要对数据或内部状态的可靠性做出或依赖于薄弱的假设,始终在执行操作之前阅读和处理“预先状态”,只需干净正确地实现代码,它就会很好地为您服务.

关于java - Hibernate 查询没有返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com