JPA2 中旧版休眠的特殊属性"elements"的替代方案



Hibernate处理查询基本值的集合,如Hibernate用户指南第30章中所述。旧版休眠条件查询,第 30.8 节集合。

对集合使用条件时,有两种不同的情况。一个是如果集合包含实体<...>,第二个是集合是否包含标量值<...>.在第一种情况下<...>,我们针对集合属性创建一个 Criteria 对象,并使用该实例限制实体或组件属性。

为了查询基本值的集合,我们仍然针对集合创建 Criteria 对象,但要引用该值,我们使用特殊属性 "elements"。

现在,由于Hibernate的API的这一部分已被弃用,我想使用JPA 2.0(或更高版本)的CriteriaQuery API重写我的getChildren()方法。(实体类已使用 javax.persistence 包中的注释重写。

在标准JPA中,有没有替代Hibernate的特殊属性"元素"?

package com.abc.model;
import java.util.*;
import javax.persistence.*;
@Entity()
@Table(name = "Group", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "Id" } ) })
public class Group {
@Column(name = "Id")
@Basic()
@Id()
private String id;
@Column(name = "ParentId")
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "GroupParentIds",
joinColumns = { @JoinColumn(name = "GroupId") })
private Set<String> parentIds = new HashSet<>();
String getId() { return id; }
}
import com.abc.model.Group;
import org.hibernate.*;
public class GroupManager {
List<Group> getChildren(Session session, Group group) {
return session.createCriteria(Group.class)
.createCriteria("parentIds")
.add(Restrictions.eq("elements", group.getId()))
.list();
}
}

我没有找到遗留属性的任何替代品。但是,就我而言,有一个不错的解决方法。

我添加了一个使用显式连接的谓词parentIds

List<Group> getChildren(Group g) {
CriteriaBuilder b = getEntityManager().getCriteriaBuilder();
CriteriaQuery q = b.createQuery();
Root r = q.from(Group.class);
q.select(r.get("name"));
Predicate p = r.join("parentIds").in(g.getId());
q.where(p);
List<Group> result = getEntityManager().createQuery(q).getResultList();
return result;
}

最新更新