一般に値を「キャスト」する必要はありません。実際、値を格納されている形式で渡すだけです。
フィールドに@Enumerated(EnumType.STRING)
としてのみ注釈が付けられていると仮定した場合 列はプレーンなvarcharフィールドになります(Java型をpostgres列挙型にマッピングすることも大きなトピックです)。
Status
のリストを比較したい場合 データベース内の関連する文字列値を持つ列挙型インスタンスは、文字列のコレクションとして渡します。つまり、toString()
と呼びます。 Javaのenum
の場合はメソッド 。
例えば。これはあなたの列挙型でした:
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();
}
または、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();
}
したがって、値のコレクションをフィルタリングするだけで可能です。