gpt4 book ai didi

hibernate - 检索 JPA 中通用实体的主键列定义

转载 作者:行者123 更新时间:2023-12-03 07:48:30 25 4
gpt4 key购买 nike

假设我有一个使用 JPA 列出实体的通用方法

    public <T> List<T> list(Class<T> entity) throws Exception {

List<T> result = new ArrayList<T>();
CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery<T> query = builder.createQuery( entity );
Root<T> root = query.from( entity );

query.select( root );

//possible?
query.orderBy(builder.asc(...));

result = em.createQuery( query ).getResultList();

return result;
}

我们是否可以将 orderby 添加到查询中并使其按主键排序,而不将主列指定为表达式?我的意思是,JPA 中是否存在 Key/Constant 或其他表示任何实体的主键列的内容,或者用于检索它的 util 方法?

最佳答案

此信息可通过 metamodel 获取。在单一 id 属性的情况下,以下内容应该有效(未经测试,因此可能会出现一些问题,特别是对于泛型,但一般方法是这样的):

public <T> SingularAttribute<? super T, ?> getIdAttribute(EntityManager em, 
Class<T> clazz) {
Metamodel m = em.getMetamodel();
IdentifiableType<T> of = (IdentifiableType<T>) m.managedType(clazz);
return of.getId(of.getIdType().getJavaType());
}

//usage
SingularAttribute idAttribute = getIdAttribute(em, entity);
Path<?> pathToId = root.get(idAttribute);
query.orderBy(builder.asc(pathToId));

当实体使用 IdClass 时也应该支持,解决方案有点复杂,但可以使用 IdentifiableType 提供的方法.

关于hibernate - 检索 JPA 中通用实体的主键列定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16909236/

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