JAVA Eclipselink запрос - PullRequest
       8

JAVA Eclipselink запрос

1 голос
/ 29 мая 2019

Я пытаюсь написать запрос JPA, который имеет 3 условных оператора where. Но я не понимаю синтаксис правильно.

try {
    Query findCustomerQuery = entityManager.createQuery("SELECT c FROM Customer c WHERE " +
            "CASE " +
            "WHEN :customerNumber is not null THEN (c.customerNumber = :customerNumber)" +
            "WHEN :customerName is not null THEN (c.name = :customerName) " +
            "WHEN :customerFirstname is not NULL THEN (c.firstName = :customerFirstname) ELSE (c.customerNumber = 0) END");

    findCustomerQuery.setParameter("customerNumber",customerNumber);
    findCustomerQuery.setParameter("customerName", customerName);
    findCustomerQuery.setParameter("customerFirstname", customerFirstname);
    return (Customer) findCustomerQuery.getSingleResult();

}finally {
    entityManager.close();
}

1 Ответ

0 голосов
/ 30 мая 2019

Для этих случаев удобно использовать JPA Criteria API .

Вот пример для вашего случая:

// get a query builder
CriteriaBuilder builder = em.getCriteriaBuilder();
// build query for entity
CriteriaQuery<Customer> criteriaQuery = builder.createQuery( Customer.class );
// set FROM entity
Root<Customer> tags = criteriaQuery.from( Customer.class );
// get a basic predicate
Predicate p = builder.and();
// add WHERE conditions properly
if (customerNumber != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerNumber"), customerNumber )
    );
    p = builder.and(p, conditionPredicate);
}
// do the same for customerName and customerFirstName
if (customerName != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerName"), customerName )
    );
    p = builder.and(p, conditionPredicate);
}
if (customerFirstName != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerFirstName"), customerFirstName )
    );
    p = builder.and(p, conditionPredicate);
}

// set predicate to query
criteriaQuery.where( p );

// call query and get results
TypedQuery<Customer> q = em.createQuery(criteriaQuery);
List<Customer> o = q.getResultList();

Вот больше примеров если вам нужно

...