JPA中的查询语句是:
Query q = entityManager.createQuery("select o from Product o WHERE o.category = :value");
q.setParameter("category", category);
如何在JPA中将类别设置为任意类别?如果传递了null类别,则只需忽略类别参数,选择所有产品。
如何在JPA中将类别设置为任意类别?如果传递了null类别,则我简单地忽略类别参数,选择所有产品。
您需要在此处动态构建查询。使用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();
处理复杂动态查询时要简单得多。
Criteria
以及其他更硬编码的替代方案的示例。https://www.tutorialspoint.com/hibernate/hibernate_quick_guide.htm - Andrei-Niculae Petreselect o from Product o WHERE :value is null or :value='' or o.category = :value
你的说法基本正确,只需要稍作修改。
Query query = entityManager.createQuery("select o from Product o WHERE o.category = :value");
query.setParameter("value", category);
在 setParameter 方法中,"value"(确切文本)应该和查询语句中的 ":value" 匹配。
SELECT * FROM PRODUCT WHERE CATEGORY=*
我想你也是SQL新手。
WHERE CATEGORY = *
并不意味着“任何类别”(甚至不是有效的SQL语句)。
在SQL和JPA中,如果您想要任何类别,您只需根本没有WHERE
子句(或者在SQL中,您可以使用WHERE CATEGORY IS NOT NULL
)。
SELECT o.* FROM product o WHERE o.category = 'SOME_CAT';
现在,如果您传递 null 而不是类别 SOME_CAT
,则 SQL 将如下所示
SELECT o.* FROM product o WHERE o.category IS NULL;
除非您的SQL类似于以下内容,否则没有SQL标准可以反转结果集更改参数值
SELECT o.* FROM product o WHERE o.category IS NOT NULL;
类似的JPQL将如下所示
SELECT o FROM Product o WHERE o.category <> :param
你可以看到,我们需要反转逻辑操作而不是操纵参数。除非使用if else条件动态构建JPQL,否则没有标准的方法来实现这种行为。
我更喜欢一个单独的方法处理程序,一个用于按类别过滤,另一个用于列出所有类别无关。
Pascal Thivent提供了相当不错的答案,建议使用Criteria
。但是他在答案中提到的Criteria
是纯粹的Hibernate Criteria
。使用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();
}
Criteria
以及其他更硬编码的替代方案的示例。https://www.tutorialspoint.com/hibernate/hibernate_quick_guide.htm - Andrei-Niculae Petre