【问题标题】:Alternative to legacy Hibernate's special property "elements" in JPA2替代 JPA2 中遗留的 Hibernate 的特殊属性“元素”
【发布时间】: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();
    }
}

【问题讨论】:

    标签: hibernate jpa jpa-2.0


    【解决方案1】:

    我还没有找到任何替代旧属性的方法。但是,就我而言,有一个很好的解决方法。

    我添加了一个使用显式连接的谓词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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多