gpt4 book ai didi

使用 Hibernate 的 Java Criteria Query - 生成的别名无效路径?

转载 作者:行者123 更新时间:2023-12-04 03:41:33 26 4
gpt4 key购买 nike

我有以下 java 代码,它使用 hibernate 谓词从我的 Appointment 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]

什么可能导致此错误?

最佳答案

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

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

此路径通常在 Predicate 元素中描述,您将其作为参数传递给名为 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;
}

您将在哪里传递方法getSearchResults 的属性from 作为参数root,以及包含“generatedAlias1.title”的字符串作为属性名;然后你可以重新声明你的谓词作为 Predicate 的一个实例,它作用于这里返回的这条路径。

我希望我已经足够清楚了

关于使用 Hibernate 的 Java Criteria Query - 生成的别名无效路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65942200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com