sql >> Databáze >  >> RDS >> Mysql

Spring JPA pomocí specifikací a CriteriaQuery na kloubových tabulkách

Můžete zabalit svou Specification s definicemi do pomocné třídy:

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 pak byste to mohli použít takto:

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

Po statických importech a refaktoringu:

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

Samozřejmě byste se měli zbavit pevně zakódovaných hodnot odtud:cb.equal(root.join("notification").get("contact"), contact); a místo toho použijte nějaký objekt DTO nebo vygenerovaný meta model JPA.

Po přidání metamodelu by to mohlo vypadat takto:

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

Více o generování metamodelů:https://docs. jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html




  1. Jak funguje sys.dm_exec_describe_first_result_set na serveru SQL Server

  2. Jak implementovat vztah many-to-many v PostgreSQL?

  3. Výběr správného indexu pro dotaz PostgreSQL

  4. Jak ověřit celočíselné hodnoty, aby se zabránilo vkládání SQL?