Java 使用CriteriaQuery选择通用主键
从Hibernate Criteria api迁移到CriteriaQuery时,我遇到了一个抽象类的通用DAO,该抽象类在公共字段上有一个where,但对其id进行选择,即使每个类的id完全不同 旧的投影像这样Java 使用CriteriaQuery选择通用主键,java,hibernate,jpa,criteriaquery,Java,Hibernate,Jpa,Criteriaquery,从Hibernate Criteria api迁移到CriteriaQuery时,我遇到了一个抽象类的通用DAO,该抽象类在公共字段上有一个where,但对其id进行选择,即使每个类的id完全不同 旧的投影像这样 criteria.setProjection(Projections.id()); 有没有类似于CriteriaQuery的方法 编辑:完整标准代码 DetachedCriteria detachedCriteria = DetachedCriteria.forClass(MyEnt
criteria.setProjection(Projections.id());
有没有类似于CriteriaQuery的方法
编辑:完整标准代码
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(MyEntity.class);
detachedCriteria.add(Restrictions.in("accountID", accounts));
detachedCriteria.setProjection(Projections.id());
EntityManager em = ...;
Criteria criteria = detachedCriteria.getExecutableCriteria((Session) em.getDelegate());
List<Integer> list = criteria.list();
DetachedCriteria DetachedCriteria=DetachedCriteria.forClass(MyEntity.class);
detachedCriteria.add(Restrictions.in(“accountID”,accounts));
detachedCriteria.setProjection(Projections.id());
实体管理器em=。。。;
Criteria=detachedCriteria.getExecutableCriteria((会话)em.getDelegate());
List=criteria.List();
我自己设法找到了它
criteriaQuery.select(
root.get(entityRoot.getModel().getDeclaredId(int.class))
);
综合答案:
我创建了这个方法:
public String getIdAttribute(EntityManager em, String fullClassName) {
Class<? extends Object> clazz = null;
try {
clazz = Class.forName(fullClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Metamodel m = em.getMetamodel();
IdentifiableType<T> of = (IdentifiableType<T>) m.managedType(clazz);
return of.getId(of.getIdType().getJavaType()).getName();
}
我得到的根实体主键如下:
String rootFullClassName = root.getModel().getJavaType().getName();
String primaryKeyName = getIdAttribute(em, rootFullClassName);
return (Specification<T>) (root, query, builder) -> {
Set<Attribute<? super T, ?>> attributes = root.getModel().getAttributes();
for (Attribute a: attributes) {
if(a.isAssociation()) {
Path rootJoinGetName = root.join(a.getName());
String referencedClassName = rootJoinGetName.getJavaType().getName();
String referencedPrimaryKey = getIdAttribute(em, referencedClassName);
//then I can use it to see if it is equal to a value (e.g
//filtering actors by movies with id = 1 - in
//this case referencedPrimaryKey is "id")
Predicate p = rootJoinGetName.get(referencedPrimaryKey).in(1);
}
}
}
我在属性上引用主键,如下所示:
String rootFullClassName = root.getModel().getJavaType().getName();
String primaryKeyName = getIdAttribute(em, rootFullClassName);
return (Specification<T>) (root, query, builder) -> {
Set<Attribute<? super T, ?>> attributes = root.getModel().getAttributes();
for (Attribute a: attributes) {
if(a.isAssociation()) {
Path rootJoinGetName = root.join(a.getName());
String referencedClassName = rootJoinGetName.getJavaType().getName();
String referencedPrimaryKey = getIdAttribute(em, referencedClassName);
//then I can use it to see if it is equal to a value (e.g
//filtering actors by movies with id = 1 - in
//this case referencedPrimaryKey is "id")
Predicate p = rootJoinGetName.get(referencedPrimaryKey).in(1);
}
}
}
返回(规范)(根、查询、生成器)->{
我们需要看到完整的信息query@JEYhibernate从这段代码运行的查询看起来像这样“hibernate:select TOP(?)this_u.profilePK as y0_u,from Profile this_u,where this_u.accountID in(?)”,所以实际上没有太多内容。没有完整的criteria@JEY我添加了完整的标准。。