JPA, где пункт любой

В JPA запрос:

Query q = entityManager.createQuery("select o from Product o WHERE o.category = :value");
q.setParameter("category", category);

Как я могу установить категорию на какую-либо категорию в JPA? Таким образом, если пустая категория передала, я простой игнорирую параметр категории, выбираю все продукты.

14
задан buræquete 18 July 2019 в 05:45
поделиться

3 ответа

SELECT * FROM PRODUCT WHERE CATEGORY = *

Думаю, вы тоже новичок в SQL.

WHERE CATEGORY = * не означает «любая категория» (это даже недопустимый SQL).

И в SQL, и в JPA у вас просто не будет предложения WHERE , если вам нужна любая категория (или в SQL вы могли бы иметь WHERE CATEGORY IS NOT NULL ).

0
ответ дан 1 December 2019 в 11:59
поделиться

Как установить категорию для любой категории в JPA? Поэтому, если пустая категория прошла, я просто игнорирую параметр категории и выбираю все продукты.

Здесь вам нужно будет создать запрос динамически. С HQL (это упрощенный пример):

Map<String, Object> params = new HashMap<String, Object>();
StringBuffer hql = new StringBuffer("from Product p");
boolean first = true;

if (category != null) {
    hql.append(first ? " where " : " and ");
    hql.append("p.category = :category");
    params.put("category", category);
}

// And so on...

Query query = session.createQuery(hql.toString());

Iterator<String> iter = params.keySet().iterator();
while (iter.hasNext()) {
    String name = iter.next();
    Object value = params.get(name);
    query.setParameter(name, value);
}

List results = query.list()

Но на самом деле я бы порекомендовал использовать здесь Criteria API:

Criteria criteria = session.createCriteria(Product.class);
if (category != null) {
    criteria.add(Expression.eq("category", category);
}
// And so on...
List results = criteria.list();

Намного проще для сложных динамических запросов.

17
ответ дан 1 December 2019 в 11:59
поделиться

Чтобы параметры архивации стали необязательными, вы можете написать запрос без использования Criteria API:

select o from Product o WHERE :value is null or :value='' or o.category = :value
5
ответ дан 1 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: