Установите необязательные параметры в JPQL Query - PullRequest
0 голосов
/ 28 мая 2018

Я получил этот список монет, которые я хочу отфильтровать с этими 3 дополнительными параметрами (Валюта, количество и год)

Как я могу установить параметры в JPQL как необязательные?Я не хочу делать 9 "если еще" для проверки, имеет ли оно значение null

Я получил функцию filtradoMonedas (filterCoins), которая фильтрует объект Moneda (coin), используя эти 3 необязательных параметра, но не работает, если естьПустой параметр.

Это просто хорошо работает, если не установить пустые параметры, если cantidad или ano is "" возвращает исключение из неверного запроса.Просто хочу это по желанию.Вот метод:

public List<Moneda> filtradoMonedas(Divisa divisa, BigDecimal cantidad, 
        BigDecimal ano){

    EntityManager em = getEntityManager();

    Query consulta = em.createQuery("SELECT m FROM Moneda m "
            + "WHERE m.divisa = :divisa "
            + "AND m.cantidad= :cantidad "
            + "AND m.ano = :ano");

    consulta.setParameter("divisa", divisa);
    consulta.setParameter("cantidad", cantidad);
    consulta.setParameter("ano", ano);

    List<Moneda> filtradoMonedas = (List<Moneda>) consulta.getResultList();
    // sincronizar los objetos devueltos con la base de datos
    for (Moneda m : filtradoMonedas) {
        em.refresh(m);
    }

    em.close();
    return filtradoMonedas;
}

1 Ответ

0 голосов
/ 28 мая 2018

JPQL не поддерживает необязательные параметры.

На самом деле вы должны думать, что не параметры являются необязательными, а условия являются необязательными.Эта идея приведет вас к созданию «динамических» запросов.И это приведет вас к следующему переходу с JPQL на Criteria API.И это приведет вас к написанию чего-то вроде этого:

    // Actually can be generated during build, and thus can be ommited
    @StaticMetamodel(Moneda.class)
    abstract class Moneda_ {
        public static volatile SingularAttribute<Moneda, BigDecimal> cantidad;
        public static volatile SingularAttribute<Moneda, Divisia> divisia;
        public static volatile SingularAttribute<Moneda, BigDecimal> ano;
    }

    final CriteriaBuilder cb = em.getCriteriaBuilder();

    final CriteriaQuery<Moneda> cq = cb.createQuery(Moneda.class);
    final Root<Moneda> root = cq.from(Moneda.class);

    Set<Predicate> predicates = new HashSet<>(3);
    if (cantidad != null) {
        predicates.add(cb.equal(root.get(Moneda_.cantidad), cantidad));
    }

    if (ano != null) {
        predicates.add(cb.equal(root.get(Moneda_.ano), ano));
    }

    if (divisia != null) {
        predicates.add(cb.equal(root.get(Moneda_.divisia), divisia));
    }

    cq.where(predicates.toArray(new Predicate[predicates.size()]));

    em.createQuery(cq).getResultList();

    // and do whatever you want 
...