Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Spring JPA menggunakan Spesifikasi dan Kriteria pada Tabel Gabungan

Anda bisa membungkus Specification s definisi ke dalam kelas pembantu:

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

Dan kemudian Anda bisa menggunakannya seperti ini:

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

Setelah impor statis dan beberapa refactoring:

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

Tentu saja Anda harus menyingkirkan nilai hardcode dari sini:cb.equal(root.join("notification").get("contact"), contact); dan gunakan beberapa objek DTO atau model meta JPA yang dihasilkan sebagai gantinya.

Setelah menambahkan metamodel akan terlihat seperti ini:

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

Selengkapnya tentang pembuatan metamodel: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. Prosedur tersimpan MySQL mengembalikan nilai

  2. Pertanyaan Dasar MySQL

  3. masukkan mysql jika tidak ada tanpa kunci unik

  4. Ubah zona waktu Google Cloud SQL CURRENT_TIMESTAMP?

  5. MySQL sangat lambat untuk mengubah kueri tabel