PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak filtrować kolumnę tablicy PostgreSQL za pomocą JPA Criteria API?

Zgodnie ze specyfikacją JPA 2.0:

Zbudowałem jednak przykład pracy na GitHubie za pomocą hibernacji.

Zakładając, że mamy to CalendarEvent podmiot i MailingCode Obiekt DTO:

@Entity(name = "CalendarEvent")
@Table
public static class CalendarEvent implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @ElementCollection
    private final List<Integer> mailingCodes = new ArrayList<>();

}

public static class MailingCode {
    private Integer id;

    public MailingCode(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }
}

Możesz napisać kod Criteria API w następujący sposób:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<CalendarEvent> criteria = builder.createQuery(CalendarEvent.class);
Root<CalendarEvent> root = criteria.from(CalendarEvent.class);

List<MailingCode> mailingCodes = Arrays.asList(
    new MailingCode(1),
    new MailingCode(2),
    new MailingCode(3)
);

Expression<List<Integer>> mailingCodesPath = root.get("mailingCodes");

Predicate predicate = builder.conjunction();

for(MailingCode mailingCode: mailingCodes){
    predicate = builder.and(predicate, builder.isMember(mailingCode.getId(), mailingCodesPath));
}

criteria.where(predicate);
List<CalendarEvent> events = entityManager.createQuery(criteria).getResultList();

Jednak zapytanie IN jest znacznie lepszym wyborem, ponieważ powyższe zapytanie SQL jest nieoptymalne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy, Declarative, PostgreSQL:nie można tworzyć tabel

  2. Duże obiekty nie mogą być używane w trybie automatycznego zatwierdzania

  3. Jak ustawić wyzwalacz, aby zaktualizować kolumnę w innej tabeli?

  4. 'rzeczy' i 'for xml path('')' z SQL Server w Postgresql

  5. Generowanie zliczeń otwartych biletów w czasie, z uwzględnieniem otwartych i zamkniętych dat