我试图学习和理解 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();
哇。一个简单的查询有很多行......但是,这仍然会从数据库中返回给我每一行。
我在这里做错了什么?
感谢您所有有用的答案:)