Java 使用 Hibernate 的条件查询 - 生成的别名无效路径?
Java Criteria Query with Hibernate - generated alias invalid path?
我有以下 java
代码,它使用 hibernate
谓词来 return 从我的预约中搜索结果 MYSQL
table.
public List<Appointment> getSearchResults(String client, AppointmentSearchRequest searchRequest, Predicate completePredicate) {
List<Appointment> searchResults = new ArrayList<>();
EntityManager entityManager = null;
try {
entityManager = entityManagement.createEntityManager(client);
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Appointment> query = builder.createQuery(Appointment.class);
Root<Appointment> from = query.from(Appointment.class);
CriteriaQuery<Appointment> selectQuery = query.select(from);
selectQuery = selectQuery.where(completePredicate);
searchResults = entityManager.createQuery(selectQuery).setFirstResult(searchRequest.getIndex()).setMaxResults(searchRequest.getSize()).getResultList();
}catch (Exception e){
//
}
return searchResults;
}
当我运行这段代码时,在下面一行:
searchResults = entityManager.createQuery(selectQuery).setFirstResult(searchRequest.getIndex()).setMaxResults(searchRequest.getSize()).getResultList();
我收到错误:
17:20:27,730 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-/127.0.0.1:8080-2) Invalid path: 'generatedAlias1.title'
17:20:27,734 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-/127.0.0.1:8080-2) Invalid path: 'generatedAlias1.title': Invalid path: 'generatedAlias1.title'
at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:119) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
可能导致此错误的原因是什么?
尝试检查您的查询
参见 。它可能就像检查查询别名一样简单。确保它们匹配,否则查询根本无法编译。您没有在这里列出您的完整查询,所以我无法判断它是否不正确。
具有讽刺意味的是,几天前我遇到了完全相同的问题:问题是你的路径“generatedAlias1.title”,这在 JPQL 中可以理解为字段 title[=32= 的取消引用] 来自用 generatedAlias1.
引用的内部实体
不幸的是,CriteriaBuilder 无法理解单个字符串中的这个复杂路径。
此路径通常在 Predicate 元素中描述,您将其作为参数传递给方法 getSearchResults ,名称为 completePredicate 。 ..(问题是你没有告诉我们你是如何创建这个谓词的)
因此您需要重构声明此路径的方式,最终使用 class javax.persistence.criteria.Path 并使用此方法计算它
final private <V> Path<V> getPath(Root<T> root, String attributeName) {
Path<V> path = null;
for (String part : attributeName.split("\.")) {
path = (path == null) ? root.get(part) : path.get(part);
}
return path;
}
你将把方法 getSearchResults 的 属性 from 作为参数 root,以及包含“generatedAlias1.title”的字符串作为attributeName;然后你可以重新声明你的谓词作为 Predicate 的一个实例,它作用于这里返回的这条路径。
希望我说得够清楚
我有以下 java
代码,它使用 hibernate
谓词来 return 从我的预约中搜索结果 MYSQL
table.
public List<Appointment> getSearchResults(String client, AppointmentSearchRequest searchRequest, Predicate completePredicate) {
List<Appointment> searchResults = new ArrayList<>();
EntityManager entityManager = null;
try {
entityManager = entityManagement.createEntityManager(client);
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Appointment> query = builder.createQuery(Appointment.class);
Root<Appointment> from = query.from(Appointment.class);
CriteriaQuery<Appointment> selectQuery = query.select(from);
selectQuery = selectQuery.where(completePredicate);
searchResults = entityManager.createQuery(selectQuery).setFirstResult(searchRequest.getIndex()).setMaxResults(searchRequest.getSize()).getResultList();
}catch (Exception e){
//
}
return searchResults;
}
当我运行这段代码时,在下面一行:
searchResults = entityManager.createQuery(selectQuery).setFirstResult(searchRequest.getIndex()).setMaxResults(searchRequest.getSize()).getResultList();
我收到错误:
17:20:27,730 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-/127.0.0.1:8080-2) Invalid path: 'generatedAlias1.title'
17:20:27,734 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (http-/127.0.0.1:8080-2) Invalid path: 'generatedAlias1.title': Invalid path: 'generatedAlias1.title'
at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:119) [hibernate-core-4.2.7.SP1-redhat-3.jar:4.2.7.SP1-redhat-3]
可能导致此错误的原因是什么?
尝试检查您的查询
参见
具有讽刺意味的是,几天前我遇到了完全相同的问题:问题是你的路径“generatedAlias1.title”,这在 JPQL 中可以理解为字段 title[=32= 的取消引用] 来自用 generatedAlias1.
引用的内部实体不幸的是,CriteriaBuilder 无法理解单个字符串中的这个复杂路径。
此路径通常在 Predicate 元素中描述,您将其作为参数传递给方法 getSearchResults ,名称为 completePredicate 。 ..(问题是你没有告诉我们你是如何创建这个谓词的)
因此您需要重构声明此路径的方式,最终使用 class javax.persistence.criteria.Path 并使用此方法计算它
final private <V> Path<V> getPath(Root<T> root, String attributeName) {
Path<V> path = null;
for (String part : attributeName.split("\.")) {
path = (path == null) ? root.get(part) : path.get(part);
}
return path;
}
你将把方法 getSearchResults 的 属性 from 作为参数 root,以及包含“generatedAlias1.title”的字符串作为attributeName;然后你可以重新声明你的谓词作为 Predicate 的一个实例,它作用于这里返回的这条路径。
希望我说得够清楚