JAVA EclipseLink необязательные параметры запроса

У меня есть запрос, который фильтрует элементы по определенным условиям:

@NamedQueries({
        @NamedQuery(
                name = ITEM.FIND_ALL_PARAMS_BY_COMPANY_COUNTRY_GROUP,
                query = "SELECT i FROM Item i where "
                        + "((i.idCompany=:companyId AND i.idEMGroup=:groupId) "
                        + "OR (i.idCompany=:companyId AND i.idEMCountry =:countryId AND i.idEMGroup is null) "
                        + "OR (i.idCompany is null AND i.idEMCountry = :countryId AND i.idEMGroup is null)) "
                        + "order by i.idEMCountry desc, i.idCompany desc, i.idEMGroup desc")
})

В некоторых случаях параметры idEMGroup o companyId могут быть нулевыми, что создает sql, похожий на этот IdEmCompany = 200630758) AND (IdEMGroup = NULL) и это неверный синтаксис SQL это можно динамически, если значение для него равно нулю как 'Column IS NULL' вместо 'Column = NULL' без добавления большого количества if, или просто лучше переписать этот запрос, используя Criteria API, и просто проверить, присутствует ли значение, и добавить предикаты при определенных условиях?

1 ответ

Решение

Правильный ответ будет использовать CriteriaQuery,

Хотя также возможно построить запрос динамически, но манипулируя @NamedQuery не возможно или может потребовать того, что не стоит делать.

Вместо этого вы можете сначала построить запрос как String и создать TypedQuery манипулируя строкой запроса

String strQuery = "SELECT i FROM Item i"; // .. + the rest of stuff
if(null==companyId) {
   // add something  like "companyId IS :companyId"
   // ":companyId" coulöd also be NULL"
   // but to enable using tq.setParameter("companyId", companyId)
   // without checking if there is param "companyId" so there always will
} else {
   // add something like "companyId=:companyId"
}
TypedQuery<Item> tq = entityManager.createQuery(strQuery, Item.class);
tq.setParameter("companyId", companyId);

Там будут некоторые IFс, но так будет в CriteriaQuery строительство также.

Другие вопросы по тегам