Mysql
 sql >> база данни >  >> RDS >> Mysql

Spring JPA с помощта на спецификации и CriteriaQuery на съвместни таблици

Можете да опаковате своята Specification s дефиниции в помощен клас:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получете резултати от мои собствени и приятели публикации

  2. MySQL – Възстановяване на пропусната база данни със схема на производителност

  3. Не мога да експортирам моята база данни от работната маса на mysql

  4. pip инсталирайте mysqlclient на amazon linux

  5. LIBSODIUM декриптира данни в mysql заявка, както направи с AES_DECRYPT