Hibernate处理查询基本值的集合,如 Hibernate User Guide, Chapter 30. Legacy Hibernate Criteria Queries, Section 30.8 Collections中所述。
在对集合使用条件时,有两种不同的情况。一种是如果集合包含实体<...>,第二种是如果集合包含标量值<...>。在第一种情况<...>中,我们针对collection属性创建一个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();
}
}
答案 0 :(得分:0)
我没有找到任何其他替代传统属性的方法。但是,在我的情况下,有一个不错的解决方法。
我添加了一个使用显式联接的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;
}