sql >> データベース >  >> RDS >> PostgreSQL

列挙型のHibernate@Filterコレクション

    一般に値を「キャスト」する必要はありません。実際、値を格納されている形式で渡すだけです。

    フィールドに@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();
    }
    

    したがって、値のコレクションをフィルタリングするだけで可能です。




    1. mysqlの異なるcharの長さに先行ゼロを追加するにはどうすればよいですか?

    2. プリペアドステートメントでワイルドカードのように使用する

    3. PL/pgsqlでEXECUTEを使用して汎用トリガーからNEW。*を挿入する

    4. SSHトンネルを介したMySQL接続