5

使用 Criteriabuilder 编写查询时,如何在两列上添加相等条件?例如:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<MyTable> root = cq.from(MyTable.class);
Predicate cond = cb.equal(root.get(MyTable_.columnA), root.get(MyTable_.columnB));

执行上述操作导致异常:

java.lang.IllegalArgumentException:参数值 [org.hibernate.jpa.criteria.path.SingularAttributePath@236f0ece] 与预期类型不匹配 [java.lang.String (n/a)]`

4

1 回答 1

3

您可以通过创建 2 个单独的“相等”谓词并使用这 2 个来创建一个新的谓词来实现此目的,criteriaBuilder.and(predicate1, predicate2);

您的查询应如下所示:

//Sample values to use in where clause
String columnATest = "Jimmy";
String columnBTest = "18";

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
//This will return a list of MyTable objects.
CriteriaQuery<MyTable> cq = cb.createQuery(MyTable.class);
Root<MyTable> root = cq.from(MyTable.class);
Predicate cond = null; 

//If both columns should match the test values
cond = cb.and(cb.equal(root.get(MyTable_.columnA), columnATest), cb.equal(root.get(MyTable_.columnB), columnBTest));

//If only one of the 2 columns should match the test values
cond = cb.or(cb.equal(root.get(MyTable_.columnA), columnATest), cb.equal(root.get(MyTable_.columnB), columnBTest));

CriteriaQuery cq = criteriaQuery.select(root).where(cond);
TypedQuery typedQuery = entityManager.createQuery(cq);
List<MyTable> results = (List<MyTable>) typedQuery.getResultList();
于 2018-04-27T12:14:39.380 回答