【发布时间】:2019-11-24 13:48:12
【问题描述】:
Hibernate 处理查询基本值的集合,如 Hibernate User Guide, Chapter 30. Legacy Hibernate Criteria Queries, Section 30.8 Collections 中所述。
对集合使用条件时,有两种不同的情况。一种是集合是否包含实体<...>,第二种是集合是否包含标量值<...>。在第一种情况下 <...> 我们针对集合属性创建一个 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();
}
}
【问题讨论】: