sql >> Database >  >> RDS >> PostgreSQL

Hoe een PostgreSQL-arraykolom filteren met de JPA Criteria API?

Volgens de specificaties van JPA 2.0:

Ik heb echter een werkend voorbeeld op GitHub sluimerstand gebruiken.

Ervan uitgaande dat we dit CalendarEvent . hebben entiteit en de MailingCode DTO-object:

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

U kunt de Criteria API-code als volgt schrijven:

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();

Een IN-query is echter een veel betere keuze, aangezien de bovenstaande SQL-query niet optimaal is.



  1. Hoe sla je complexe product-/bestelgegevens op in MySQL?

  2. De beschikbaarheid van kamers beheren op basis van dagen of maanden bezetting

  3. Tabelrijen tellen

  4. MySQL:benoemde parameters met PREPARE-opdracht?