【问题标题】:Java Criteria Query with Hibernate - generated alias invalid path?Java Criteria Query with Hibernate - 生成的别名无效路径?
【发布时间】:2021-05-02 15:33:48
【问题描述】:

我有以下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;
}

当我运行此代码时,在以下行:

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]

什么可能导致这个错误?

【问题讨论】:

  • 您可以尝试更新您的休眠版本并检查一下,这会有所帮助
  • 这不起作用
  • 最新版本是Hibernate 5.4.x。您尝试了哪个版本?
  • 我认为问题在于谓词是由不同的 CriteriaBuilder(不同的别名)创建的
  • 是的,问题在于创建谓词的根,您必须确保它与查询中使用的根相同。也许最好的选择是在 getSearchResults 中创建 de 谓词并重写方法以另一种方式获取条件。

标签: java mysql hibernate predicate hibernate-criteria


【解决方案1】:

具有讽刺意味的是,几天前我刚刚遇到了完全相同的问题:问题是您的路径“generatedAlias1.title”在 JPQL 中可以理解为从引用的内部实体中取消引用字段 title 生成的别名1

不幸的是,CriteriaBuilder 无法理解单个字符串中的这种复杂路径。

此路径通常在 Predicate 元素中描述,您在此处作为参数传递给您的方法 getSearchResults 名称为 completePredicate ...(问题是您没有告诉我们你是如何创建这个谓词的)

所以你需要重构你声明这个路径的方式,最终使用类 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”的字符串作为属性名;然后您可以将您的谓词重新声明为 Predicate 的实例,该实例在此处返回的此路径上起作用。

我希望我已经足够清楚了

【讨论】:

    【解决方案2】:

    尝试检查您的查询

    this answer。它可能就像检查您的查询别名一样简单。确保它们匹配,否则查询将根本无法编译。您没有在此处列出完整的查询,所以我无法判断它是否不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2011-05-11
      • 2014-10-03
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多