【问题标题】:Criteriabuilder equal on two columnsCriteriabuilder 在两列上相等
【发布时间】:2018-02-19 22:01:03
【问题描述】:

使用 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)]`

【问题讨论】:

  • 你的意思是2个字段?因为 JPQL 和 JPA Criteria 不处理列。发布该异常的其余标准代码+堆栈跟踪;然后揭示问题所在。它在where子句中吗?还是在选择子句中?就目前而言,您发布的代码完全正确。
  • 如 DN1 所述:您的 where 在哪里?你是什​​么select?你如何执行你的cq

标签: java hibernate jpa jpa-criteria


【解决方案1】:

您可以通过创建 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-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2021-09-20
    • 2016-03-06
    相关资源
    最近更新 更多