gpt4 book ai didi

hibernate - JPA 标准分离

转载 作者:行者123 更新时间:2023-12-02 23:14:01 24 4
gpt4 key购买 nike

我正在尝试学习和理解 JPA 标准。到目前为止,我在 SQL 方面非常有能力,在 Hibernate Criteria 和 HQL 方面也相当有能力。

我正在尝试使用 OR 语句进行相当简单的选择。

在普通 SQL 中,我的选择如下所示:

SELECT * FROM CHANGED_LOG
WHERE key1 = 52540 AND objectCode = 'Order'
OR key1 = 48398 AND objectCode = 'Package'

这给了我 key1 = 52540 且 objectCode 等于 Order 的每一行并且还有 key = 48398 且 objectCode 等于 Package 的每一行。这正是我想要的。

因此,尝试使用 JPA 标准(这似乎异常复杂......)来做到这一点,到目前为止我最好的猜测是:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery<ChangedLogBean> query = builder.createQuery(ChangedLogBean.class);
Root<ChangedLogBean> from = query.from(ChangedLogBean.class);
CriteriaQuery<ChangedLogBean> select = query.select(from);

Predicate orderChangedLogBeans = builder.conjunction();
builder.and(orderChangedLogBeans, builder.equal(from.get("key1"), orderId));
builder.and(orderChangedLogBeans, builder.equal(from.get("objectCode"), ChangedLogBean.ObjectType.OrderBean));

Predicate packageChangedLogBeans = builder.conjunction();
builder.and(packageChangedLogBeans, builder.equal(from.get("key1"), packageId));
builder.and(packageChangedLogBeans, builder.equal(from.get("objectCode"), ChangedLogBean.ObjectType.PackageBean));

Predicate orderOrPackage = builder.disjunction();
orderOrPackage.getExpressions().add(orderChangedLogBeans);
orderOrPackage.getExpressions().add(packageChangedLogBeans);

query.where(orderOrPackage);

return entityManager.createQuery(select).getResultList();

哇。一个简单的查询有很多行...但是,这仍然返回给我数据库中的每一行。

我在这里做错了什么?

感谢您提供的所有有用的答案:)

最佳答案

在这种情况下要做的第一件事是配置 JPA 提供程序以记录生成的查询。请参阅this q/a举个例子。

为了回答您的问题,我不确定 getExpressions() 的使用,因此我建议采用以下粗鲁的方法:

Predicate p1 = builder.equal(...);
Predicate p2 = builder.equal(...);
Predicate p3 = builder.equal(...);
Predicate p4 = builder.equal(...);

Predicate p5 = builder.and(p1, p2);
Predicate p6 = builder.and(p3, p4);

query.where(builder.or(p5, p6));

你的错误是这样一行:

builder.and(orderChangedLogBeans, builder.equal(from.get("key1"), orderId));

不会就地修改orderChangedLogBeans。您必须获得 CriteriaBuilder#and() 返回的谓词相反:

orderChangedLogBeans = builder.and(orderChangedLogBeans, builder.equal(from.get("key1"), orderId));

关于hibernate - JPA 标准分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397436/

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