gre*_*red 6 java postgresql enums hibernate
我需要弄清楚如何将基于注释的过滤应用于枚举的参数列表,定义如下:
@Column(name = "target_status")
@Enumerated(EnumType.STRING)
@Type(type="PGEnumConverter", parameters = {
@Parameter(name = "enumClassName",
value = "com.company.model.campaign.CampaignTarget$Status")
})
private Status targetStatus;
Run Code Online (Sandbox Code Playgroud)
所以我@FilterDef
看起来像这样:
@FilterDef(name="filterCampaignTargetByStatuses",
defaultCondition="target_status in (:statuses)",
parameters = @ParamDef(name = "statuses", type = "string"))
Run Code Online (Sandbox Code Playgroud)
当我启用过滤器时,它看起来像这样:
session.enableFilter("filterCampaignTargetByStatuses").
setParameterList("statuses", statuses);
Run Code Online (Sandbox Code Playgroud)
我从hibernate获得的错误是:
org.hibernate.HibernateException: Incorrect type for parameter [statuses]
Run Code Online (Sandbox Code Playgroud)
数据在PostgreSQL中并且类型的定义如下:
CREATE TYPE statuscmp AS ENUM ('ACTIVE','INACTIVE','PAUSED','DRAFT','SCHEDULED','ENDED','ARCHIVED');
Run Code Online (Sandbox Code Playgroud)
我已经看到很多关于如何针对单个Enum值进行标准查询和过滤的SO问题,但是还没有关于对一组 Enum值进行过滤的问题.有没有办法明确地投射个别价值观?
一般来说,您不必“转换”该值,事实上您只需以存储的形式传递值即可。
如果我们假设您的字段仅被注释为该@Enumerated(EnumType.STRING)
列将是一个普通的 varchar 字段。(将 java 类型映射到 postgres 枚举是另一个大主题。)
如果您现在想要将Status
枚举实例列表与数据库中的相关字符串值进行比较,请将其作为字符串集合传递,换句话说,toString()
如果它是 java ,则调用它的方法enum
。
例如,这是你的枚举:
public enum EntityStatus {
A, B, C;
}
Run Code Online (Sandbox Code Playgroud)
这是您的实体:
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
@Entity
@FilterDef(name = "byMultipleStates", defaultCondition = "status in (:states)", parameters = @ParamDef(name = "states", type = "string"))
@Filter(name = "byMultipleStates", condition = "status in (:states)")
public class StatusEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Enumerated(EnumType.STRING)
private EntityStatus status;
public long getId() {
return id;
}
public EntityStatus getStatus() {
return status;
}
public void setStatus(EntityStatus status) {
this.status = status;
}
}
Run Code Online (Sandbox Code Playgroud)
这可能是您要过滤的代码:
public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
final Session hibernateSession = entityManager.unwrap(Session.class);
hibernateSession.enableFilter("byMultipleStates").setParameterList("states",
states.stream().map(state -> state.toString()).collect(Collectors.toList()));
final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");
return query.list();
}
Run Code Online (Sandbox Code Playgroud)
或者Java 8之前的方式:
public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
final Set<String> statesAsString = new HashSet<>();
for (final EntityStatus state : states) {
statesAsString.add(state.toString());
}
final Session hibernateSession = entityManager.unwrap(Session.class);
hibernateSession.enableFilter("byMultipleStates").setParameterList("states", statesAsString);
final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");
return query.list();
}
Run Code Online (Sandbox Code Playgroud)
因此,仅过滤值的集合是可能的。
归档时间: |
|
查看次数: |
1150 次 |
最近记录: |