【问题标题】:Spring Hibernate find all records that have value in setSpring Hibernate 查找集合中有值的所有记录
【发布时间】:2016-10-15 14:07:18
【问题描述】:

我有实体医生

@Entity
    public class Doctor extends Account {         
    //other attributes
    @Column
    @ElementCollection(targetClass = Speciality.class, fetch = FetchType.EAGER)
    private Set<Speciality> speciality = new HashSet<Speciality>(0);        
    //getters and setters
    }

和实体专长

@Entity
    public class Speciality {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    String name;
    //getters and setters here
}

现在在我的应用程序中,用户可以选择想要访问的医生的专业。例如用户选择 内分泌学家,现在我的应用程序需要找到所有在 Set 专业中拥有专业内分泌学家的医生。 如何做到这一点?

【问题讨论】:

  • 嘿@implssv。请给我反馈我的answer。如果它对您有用,请将其标记为已接受。
  • 每个答案都很好,但你写了更多关于良好实践的内容:)

标签: java sql spring hibernate


【解决方案1】:

您可以使用 Hibernate Criteria Queries Builder API 轻松做到这一点:

final List<Doctor> doctors = getSession()
       .createCriteria(Doctor.class, "doc")
       .add(Restrictions.eq("doc.speciality.id", specialityId))
       .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
       .list();

【讨论】:

  • 不要将条件 API 用于简单的情况。在这种情况下使用它的唯一原因是让生活变得不必要的艰难。由于他使用 Spring,他应该使用 spring-data-jpa。
  • @mh-dev 我同意 Spring Data JPA 更好。但是 Hibernate Criteria 对于这样的简单查询实际上很有用。结果集中的列不多,查询会很快执行。
【解决方案2】:

使用元素:

SELECT d
    FROM Doctor d
    WHERE 
        :spec IN elements(d.speciality)

【讨论】:

    【解决方案3】:

    您可以使用 MEMBER OF JPQL 语句执行此操作。

    例如:

    Select d From Doctor d where :speciality MEMBER OF d.speciality
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多