在JPA2中替代传统的Hibernate的特殊属性“元素”

时间:2019-07-15 20:35:38

标签: hibernate jpa jpa-2.0

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();
    }
}

1 个答案:

答案 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;
}