Java 两列上的标准生成器相等

Java 两列上的标准生成器相等,java,hibernate,jpa,jpa-criteria,Java,Hibernate,Jpa,Jpa Criteria,使用Criteriabuilder编写查询时,如何在两列上添加相等条件?e、 g: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<String> cq = cb.createQuery(String.class); Root<MyTable> root = cq.from(MyTable.class); Predicate cond = cb.equal(root.get(My

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

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));
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(String.class);
Root=cq.from(MyTable.class);
谓词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)]不匹配`


您可以通过创建两个独立的“相等”谓词并使用这两个谓词使用criteriaBuilder.and(谓词1,谓词2)创建一个新的谓词来实现这一点

您的查询应如下所示:

//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();
//在where子句中使用的示例值
字符串columnATest=“Jimmy”;
字符串columnBTest=“18”;
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
//这将返回MyTable对象的列表。
CriteriaQuery cq=cb.createQuery(MyTable.class);
Root=cq.from(MyTable.class);
谓词cond=null;
//如果两列都应与测试值匹配
cond=cb.and(cb.equal(root.get(MyTable_.columnA),ColumnTest),cb.equal(root.get(MyTable_.columnB),columnBTest));
//如果两列中只有一列与测试值匹配
cond=cb.or(cb.equal(root.get(MyTable_.columnA),ColumnTest),cb.equal(root.get(MyTable_.columnB),columnBTest));
CriteriaQuery cq=CriteriaQuery.select(root.where)(cond);
TypedQuery TypedQuery=entityManager.createQuery(cq);
List results=(List)typedQuery.getResultList();

你是说两个字段?因为JPQL和JPA标准不处理列。发布该异常的其余条件代码+堆栈跟踪;这就揭示了问题所在。它在where条款中吗?还是在select子句中?您发布的代码就其本身而言是完全正确的。正如DN1所述:您的
where
?你选择了什么?您如何执行您的
cq