Raj*_*jan 6 java enums hibernate jpa spring-data-jpa
尝试在数据库级别使用规范过滤数据。我有一个实体,另一个实体作为实例,其中实例变量类包含一个Emun字段。默认情况下,数据库中的枚举字段为字符串。
@Entity
public class Outer{
@OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinColumn(name = "current_status")
private Status current;
@OneToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinColumn(name = "past_status")
private Status past;
...
...
@Entity
public class Status{
@Enumerated(EnumType.STRING)
@Column(name = "state")
private State state;
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid",strategy = "uuid2")
@Column(name = "id")
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "outer_id")
private Outer outer;
Run Code Online (Sandbox Code Playgroud)
我已经static meta models为两个类创建了。
如何使用提供的枚举值(不是枚举实例)的子句创建一个Predicate匹配项?Statewhere inStrings
您将实体属性建模为EnumHibernate,因此需要在所有 JPQL 或 Criteria 查询中使用枚举。
因此,您要么必须将所有Strings 映射到State枚举,要么使用本机 SQL 查询。
Hibernate 不解析本机查询,它们基于表模型而不是实体模型。这允许您使用枚举String的表示形式State。
你可以这样做:
List<State> states = ... // get or initialize your State list here
Query q = em.createNativeQuery("SELECT * FROM Status s WHERE state IN (:states)", Status.class);
q.setParameter("states", states);
List<Status> s = (List<Status>) q.getResultList();
Run Code Online (Sandbox Code Playgroud)
该createNativeQuery方法的第二个参数告诉 Hibernate 将结果集的每条记录映射到一个Status实体。这些实体是受管理的,您可以使用它们来更新或删除映射的数据库记录。
要使用此映射,您需要确保查询选择实体映射的所有列。我写了一系列文章,详细介绍了不同的结果映射选项: