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

Я новичок в JPA.

В JPA запрос выглядит так:

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

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

12 голосов | спросил Ke. 13 MaramSat, 13 Mar 2010 05:34:54 +03002010-03-13T05:34:54+03:0005 2010, 05:34:54

6 ответов


0
  

Как я могу установить категорию для любой категории в 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();

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

ответил Pascal Thivent 13 MarpmSat, 13 Mar 2010 23:43:37 +03002010-03-13T23:43:37+03:0011 2010, 23:43:37
0

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

select o from Product o WHERE :value is null or :value='' or o.category = :value
ответил palmal 28 AMpWed, 28 Apr 2010 00:59:18 +040059Wednesday 2010, 00:59:18
0

Вы правы почти с небольшими изменениями.

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

в setParamater «значение» (точный текст) должно совпадать с «: значением» в запросе.

ответил changeme 31 Mayam12 2012, 01:16:56
0
  

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

Вы можете установить категорию на «%». if (category == null) query.setParameter ("category", "%"); иначе query.setParameter ("категория", категория);

ответил Veer Muchandi 10 AMpTue, 10 Apr 2012 05:51:27 +040051Tuesday 2012, 05:51:27
0
  

ВЫБРАТЬ * ИЗ ПРОДУКТА, ГДЕ КАТЕГОРИЯ = *

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

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

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

ответил Thilo 13 MaramSat, 13 Mar 2010 05:40:23 +03002010-03-13T05:40:23+03:0005 2010, 05:40:23
0

Pascal Thivent дал довольно хороший ответить , рекомендуя использовать Criteria. Однако Criteria в его ответе чисто Hibernate критерии. Используя пример JPA Criteria:

private List<Result> getProduct(String category) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Product> criteria = builder.createQuery(Product.class);
    Root<Product> productRoot = criteria.from(Product.class);

    if (category != null)
        criteria.where(builder.equal(productRoot.get("category"), category))    
    }

    entityManager.createQuery(criteria).getResultList();
}
ответил J-Alex 23 52018vEurope/Moscow11bEurope/MoscowFri, 23 Nov 2018 14:11:14 +0300 2018, 14:11:14

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132