Java Hibernate@Filter枚举集合

Java Hibernate@Filter枚举集合,java,hibernate,postgresql,enums,Java,Hibernate,Postgresql,Enums,我需要弄清楚如何应用基于注释的筛选,并将枚举的参数列表定义为: @Column(name = "target_status") @Enumerated(EnumType.STRING) @Type(type="PGEnumConverter", parameters = { @Parameter(name = "enumClassName", value = "com.company.model.campaign.CampaignTarget$Status"

我需要弄清楚如何应用基于注释的筛选,并将枚举的参数列表定义为:

@Column(name = "target_status")
@Enumerated(EnumType.STRING)
@Type(type="PGEnumConverter", parameters = {
    @Parameter(name = "enumClassName",
               value = "com.company.model.campaign.CampaignTarget$Status")
})
private Status targetStatus;
因此,我的
@FilterDef
如下所示:

    @FilterDef(name="filterCampaignTargetByStatuses",
               defaultCondition="target_status in (:statuses)",
               parameters = @ParamDef(name = "statuses", type = "string"))
    session.enableFilter("filterCampaignTargetByStatuses").
    setParameterList("statuses", statuses);
当我启用过滤器时,它如下所示:

    @FilterDef(name="filterCampaignTargetByStatuses",
               defaultCondition="target_status in (:statuses)",
               parameters = @ParamDef(name = "statuses", type = "string"))
    session.enableFilter("filterCampaignTargetByStatuses").
    setParameterList("statuses", statuses);
我从hibernate得到的错误是:

 org.hibernate.HibernateException: Incorrect type for parameter [statuses]
数据采用PostgreSQL格式,类型定义如下:

CREATE TYPE statuscmp AS ENUM ('ACTIVE','INACTIVE','PAUSED','DRAFT','SCHEDULED','ENDED','ARCHIVED');
我见过很多关于如何对单个枚举值进行条件查询和筛选的问题,但还没有一个关于对一组枚举值进行筛选的问题。有没有一种方法可以显式转换各个值?

一般来说,您不必“转换”值,事实上,您只需以存储的形式传递值即可

如果我们假设您的字段仅注释为
@Enumerated(EnumType.STRING)
,则该列将是一个普通的varchar字段。 (将java类型映射到postgres枚举是另一个重要主题。)

如果现在要将
状态
枚举实例列表与数据库中的相关字符串值进行比较,请将其作为字符串集合传递,换句话说,如果它是java
枚举
,请调用它的
toString()
方法

例如,这是您的枚举:

public enum EntityStatus {
    A, B, C;
}
这是您的实体:

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;
    }

}
这可能是要筛选的代码:

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();
}
公共列表过滤器系统状态(最终设置状态){
最终会话hibernateSession=entityManager.unwrap(Session.class);
hibernateSession.enableFilter(“ByMultipleEstates”).setParameterList(“状态”,
states.stream().map(state->state.toString()).collect(Collectors.toList());
final Query Query=hibernateSession.createQuery(“从状态实体e中选择e”);
返回query.list();
}
或者以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();
}
公共列表过滤器系统状态(最终设置状态){
final Set statesAsString=new HashSet();
for(最终实体状态状态:状态){
statesAsString.add(state.toString());
}
最终会话hibernateSession=entityManager.unwrap(Session.class);
hibernateSession.enableFilter(“byMultipleStates”).setParameterList(“states”,statesAsString);
final Query Query=hibernateSession.createQuery(“从状态实体e中选择e”);
返回query.list();
}
因此,只过滤一组值是可能的