繁体   English   中英

JPA最佳实践-加入只读数据

[英]Best Practices for JPA - joining read-only data

我正在使用具有两个类的JPA模型。 第一个映射具有“动态”数据的表,第二个映射具有只读参考数据的表。

例如,我有一个Person实体映射一个Person表,其中包含一个对Civility实体的@OneToOne引用,该引用本身映射到Civility表(2列),其中仅包含3条记录(Miss,Mrs和Mr) 。

我想知道基于Civility值在人员实体上编写查询的最佳方法。 例如,我将使用什么查询来获得所有具有文明=先生的人?

谢谢。

映射参考查找数据的一种方法是在jpa中使用@Enumerated批注。 您仍然必须使用查找值创建枚举,但这就是为什么无论如何它还是参考数据。

例如,我有一个评级代码,它在表上是一个字符串/ varchar值。 但是可以使用枚举来使用它:

@Enumerated(EnumType.STRING)
@Column
public RatingCode getRating() {
  return rating;
}
public void setRating(RatingCode rating) {
   this.rating = rating;
}

枚举是:

public enum RatingCode {
    Core, Star
}

使用单元测试尝试所有值,并且您知道这是获取参考数据的安全方法。

您仍然可以使用HQL提取值,并将枚举作为值传递:

hql = "select r from Rating as r where r.rating = :aEnum"

// and in the call to pass the parameter
qry.setParameter("aEnum", aRatingCode)

枚举是Rating实体内的一个字段:

@Entity
@Table
public class Rating {

    private Integer rating_Id;

    private RatingCode rating;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column
    public Integer getRating_Id() {
        return rating_Id;
    }
    public void setRating_Id(Integer rating_Id) {
        this.rating_Id = rating_Id;
    }

    @Enumerated(EnumType.STRING)
    @Column
    public RatingCode getRating() {
        return rating;
    }
    public void setRating(RatingCode rating) {
        this.rating = rating;
    }

}

所以我有一个配置文件,需要一个评级,所以我通过枚举查找了一个评级并将其添加到配置文件中。

Profile p = new Profile();
RatingServiceI rs = new RatingService()
Rating r = rs.getRating(RatingCode.Core);
p.setRating(r);

您没有发布实体定义,因此您将需要解释此答案中的代码以与您的实际模型匹配。 另外,请注意,在这种情况下,查询实体本身与基础表中的数据是否为“只读”无关:

final String queryStr = "SELECT p FROM Person p WHERE p.civility.value = :value";
final TypedQuery<Person> query = entityManager.createQuery(queryStr, Person.class);
query.setParameter("value", "Mr");
List<Person> results = query.getResultList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM