Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Hibernate生成的别名的Java条件查询路径无效?_Java_Mysql_Hibernate_Predicate_Hibernate Criteria - Fatal编程技术网

具有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;
}