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

ジョイントテーブルで仕様とCriteriaQueryを使用するSpringJPA

    Specificationをラップすることができます ヘルパークラスへの定義:

    public class DelegationSpecificationsHelper {
    
        public static Specification<Domain> notificationContactSpec(String contact) {
            return (root, query, cb) -> cb.equal(root.join("notification").get("contact"), contact);
        }
    
        public static Specification<Domain> idSpec(SearchCriteria searchCriteria) {
            switch (criteria.getOperation()) {
              case ":":
                if (root.get(criteria.getKey()).getJavaType() == String.class) {
                  return builder.like(
                          root.<String>get(criteria.getKey()),
                          "%" + criteria.getValue() + "%");
                } else {
                  return builder.equal(root.get(criteria.getKey()),
                          criteria.getValue());
                }
              case "=":
                return builder.equal(root.get(criteria.getKey()),
                        criteria.getValue());
              default:
                return null;
            }
        }
    }
    

    そして、次のように使用できます:

    Specifications<Domain> specifications = Specifications.where(DelegationSpecificationsHelper.idSpec(new SearchCriteria("id", "=", domainId))
                                                          .and(DelegationSpecificationsHelper.notificationContactSpec("someSearchString"));
    

    静的インポートといくつかのリファクタリングの後:

    SearchCriteria idCriteria = new SearchCriteria("id", "=", domainId)
    Specifications<Domain> specifications = 
                     Specifications.where(idSpec(idCriteria)
                                   .and(notificationContactSpec("someSearchString"));
    

    もちろん、ここからハードコードされた値を削除する必要があります:cb.equal(root.join("notification").get("contact"), contact); 代わりに、DTOオブジェクトまたは生成されたJPAメタモデルを使用してください。

    メタモデルを追加すると、次のようになります。

     public static Specification<Domain> notificationContactSpec(String contactValue) {
            return (root, query, cb) -> cb.equal(root.join(Domain_.notification).get(Notification_.contact), contactValue);
     }
    

    メタモデル生成の詳細: https://docs。 jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html




    1. MySQLはCONCAT条件で選択します

    2. リレーショナルデータベースでパフォーマンスの問題を説明するにはどうすればよいですか?

    3. Oracle 11gクライアントを10gサーバーで使用しても大丈夫ですか?

    4. psqlで、一部のコマンドが効果を持たないのはなぜですか?