gpt4 book ai didi

java - JPA CriteriaBuilder 泛型错误 : CriteriaQuery 不适用于参数 (Expression)

转载 作者:行者123 更新时间:2023-12-01 13:18:58 24 4
gpt4 key购买 nike

我是 JPA CriteriaBuilder 的新手,并且遇到了 JPA Criteria 查询的泛型错误,我似乎无法理解或解决该错误。我正在尝试将以下查询转换为 Criteria 查询以在 Spring 数据存储库中使用:

select * from User where id = ( select max(id) from User);

我尝试根据我在 https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria 看到的代码执行以下操作,但它给出了编译时错误:

new Specification<User>() {

@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
root = query.from(User.class);
cb.greatest(root.<Long>get("id"))
query.select(cb.max(root.<Long>get("id")));
// TODO Auto-generated method stub
return null;
}
});

当然,我只是意识到,一旦我弄清楚如何指定查询,我什至不确定如何将其转换为谓词。

我在这里完全偏离基地了吗?如何将上述 SQL 转换为我可以使用的谓词?

最佳答案

目前的肮脏解决方法:

public static User getGreatestId(EntityManager em){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> userRoot = cq.from(User.class);
Path<Long> pathToId = userRoot.get("id");
cq.select(userRoot).orderBy(cb.desc(pathToId));
TypedQuery<User> typed = em.createQuery(cq);
typed.setMaxResults(1);
return typed.getSingleResult();
}

使用子查询:

 public static User getGreatestId(EntityManager em){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> userRoot = cq.from(User.class);
Path<Long> pathToId = userRoot.get("id");
Subquery<Long> subquery = cq.subquery(Long.class);
Root<User> subRoot = subquery.from(User.class);
Path<Long> subPathToId = subRoot.get("id");
subquery.select(cb.max(subPathToId));
cq.select(userRoot).where(cb.equal(pathToId, subquery));
TypedQuery<User> typed = em.createQuery(cq);
return typed.getSingleResult();
}

关于java - JPA CriteriaBuilder 泛型错误 : CriteriaQuery<capture#2-of ? > 不适用于参数 (Expression<Long>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205684/

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