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

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

13 голосов
/ 13 марта 2010

Я новичок в JPA.

В JPA запрос:

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

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

Ответы [ 6 ]

17 голосов
/ 13 марта 2010

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

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

5 голосов
/ 28 апреля 2010

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

select o from Product o WHERE :value is null or :value='' or o.category = :value
2 голосов
/ 31 мая 2012

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

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

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

1 голос
/ 10 апреля 2012

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

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

0 голосов
/ 23 ноября 2018

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();
}
0 голосов
/ 13 марта 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...