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

JPA Criteria APIを使用してPostgreSQL配列列をフィルタリングするにはどうすればよいですか?

    JPA 2.0仕様によると:

    ただし、GitHubでの実例 Hibernateを使用します。

    このCalendarEventがあると仮定します エンティティとMailingCode DTOオブジェクト:

    @Entity(name = "CalendarEvent")
    @Table
    public static class CalendarEvent implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        @ElementCollection
        private final List<Integer> mailingCodes = new ArrayList<>();
    
    }
    
    public static class MailingCode {
        private Integer id;
    
        public MailingCode(Integer id) {
            this.id = id;
        }
    
        public Integer getId() {
            return id;
        }
    }
    

    CriteriaAPIコードは次のように記述できます。

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<CalendarEvent> criteria = builder.createQuery(CalendarEvent.class);
    Root<CalendarEvent> root = criteria.from(CalendarEvent.class);
    
    List<MailingCode> mailingCodes = Arrays.asList(
        new MailingCode(1),
        new MailingCode(2),
        new MailingCode(3)
    );
    
    Expression<List<Integer>> mailingCodesPath = root.get("mailingCodes");
    
    Predicate predicate = builder.conjunction();
    
    for(MailingCode mailingCode: mailingCodes){
        predicate = builder.and(predicate, builder.isMember(mailingCode.getId(), mailingCodesPath));
    }
    
    criteria.where(predicate);
    List<CalendarEvent> events = entityManager.createQuery(criteria).getResultList();
    

    ただし、上記のSQLクエリは最適ではないため、INクエリの方がはるかに適しています。



    1. OracleQueryによる数量を年ごとにロールアップ-過去3年間のみ

    2. ループなしのキーによる多次元配列の値の合計

    3. Postgresql。 CREATECAST'文字が'から'整数'に変化します

    4. SQL算術演算子