我正在使用带有两个类的JPA模型。第一个是使用“动态”数据映射表,第二个是使用只读参考数据映射表。
作为一个例子,我有一个Person
实体映射一个Person Table,它包含对Civility
实体的@OneToOne引用,该实体本身映射到只有Civility表(2列)其中3条记录(Miss,Mrs和Mr)。
我想知道基于Civility值在person实体上编写查询的最佳方法。例如,我将使用什么查询来获取所有具有文明的人员?先生?
感谢。
答案 0 :(得分:1)
映射引用查找数据的一种方法是在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)
枚举是评级实体中的一个字段:
@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);
答案 1 :(得分:0)
您没有发布实体定义,因此您需要解释此答案中的代码以与实际模型匹配。另请注意,在这种情况下,查询实体本身无论基础表中的数据是否为“只读”都无关:
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();