Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Spring JPA przy użyciu specyfikacji i CriteriaQuery na wspólnych tabelach

Możesz zawinąć swoją Specification s definicji do klasy pomocniczej:

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;
        }
    }
}

A potem możesz go użyć w ten sposób:

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

Po statycznym imporcie i refaktoryzacji:

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

Oczywiście powinieneś pozbyć się zakodowanych wartości tutaj:cb.equal(root.join("notification").get("contact"), contact); i zamiast tego użyj jakiegoś obiektu DTO lub wygenerowanego metamodelu JPA.

Po dodaniu metamodelu może to wyglądać tak:

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

Więcej o generowaniu metamodeli: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. Łączenie się z bazą danych mySQL za pomocą asp.net

  2. Kod błędu MySQL:1030Got error -1 z silnika pamięci masowej; Próbowałem usunąć dane z mojej bazy danych

  3. zawartość pliku binarnego pokazana w php print_r, ale nie zapisana w mysql

  4. Jak utworzyć procedurę składowaną w MySQL za pomocą Knex raw

  5. Laravel 5.4 na PHP 7.0:Wyjątek PDO — nie można znaleźć sterownika (MySQL)