具有Hibernate生成的别名的Java条件查询路径无效?
我有以下具有Hibernate生成的别名的Java条件查询路径无效?,java,mysql,hibernate,predicate,hibernate-criteria,Java,Mysql,Hibernate,Predicate,Hibernate Criteria,我有以下java代码,它使用hibernate谓词从我的约会MYSQL表返回搜索结果 public List<Appointment> getSearchResults(String client, AppointmentSearchRequest searchRequest, Predicate completePredicate) { List<Appointment> searchResults = new ArrayList<>();
java
代码,它使用hibernate
谓词从我的约会MYSQL
表返回搜索结果
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;
}
我得到一个错误:
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中可以理解为从generatedAlias1引用的内部实体中取消对字段标题的引用 不幸的是,CriteriaBuilder无法理解单个字符串中的复杂路径 此路径通常在谓词元素中描述,您在此处将其作为参数传递给名为completePredicate的方法getSearchResults。。。(问题是您没有告诉我们如何创建此谓词) 因此,您需要重构声明此路径的方式,最终使用类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;
}
最终私有路径getPath(根根,字符串attributeName){
路径=空;
用于(字符串部分:attributeName.split(“\\”)){
path=(path==null)?root.get(部分):path.get(部分);
}
返回路径;
}
其中,您将通过方法getSearchResults的属性作为参数根传递,并将包含“generatedAlias1.title”的字符串作为attributeName传递;然后,您可以将谓词重新声明为谓词的实例,该谓词作用于此处返回的路径
我希望我已经足够清楚了您可以尝试更新您的hibernate版本并进行检查,这将有助于解决此问题。最新版本是hibernate 5.4.x。您尝试了哪个版本?我认为问题在于谓词是由不同的CriteriaBuilder(不同的别名)创建的。是的,问题在于创建谓词的根,您必须确保它与查询中使用的根相同。也许最好的选择是在
getSearchResults
中创建de谓词,然后重写该方法,以另一种方式接受条件。
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;
}