2017-08-30 35 views
0

我有以下查询:条件和使用Hibernate

@NamedQuery(name = "User.findByParams", query= 
    "SELECT * 
    FROM User user 
    WHERE user.name type = :inputType") 

我想补充AND声明,将采取只有当输入提供的地方:

@NamedQuery(name = "User.findByParams", query= 
    "SELECT * 
    FROM User user 
    WHERE user.name type = :inputType AND (:ageInput != null AND user.age > :ageInput") 

这意味着,如果ageInput被提供,也由它进行过滤。如果不是 - 忽略这个参数。有任何想法吗?

任何想法?

+2

不是在一个命名查询(据我所知)。对此使用'Criteria' API – XtremeBaumer

+0

不适用于SQL方式!正如@XtremeBaumer所说,从JPA2开始,您可以使用Criteria API作为 – elrado

+1

'... AND(:ageInput == null或user.age>:ageInput)' –

回答

0

您必须检查是否提供了ageInput代码,并且必须相应调用不同的方法。 意思是,如果提供了ageInput,那么您将不得不调用具有约束条件的约束o/w调用方法的方法。

或者,您可以使用谓词并执行查询。

1

正如前面的发言者写的,你可以使用标准

Criteria criteria = createCriteria() 
     .add(Restrictions.eq("type", type)); 

if (ageInput != null) { 
    criteria.add(Restrictions.eq("ageInput", ageInput)); 
} 

List<User> list = criteria.list(); 

或的SQLQuery

String sql = "SELECT * " + 
     "FROM User user " + 
     "WHERE user.type = :inputType "; 

sql += (ageInput != null) ? "AND ageInput = :ageInput " : ""; 

Query query = sessionFactory.getCurrentSession().createSQLQuery(sql) 
     .setParameter("inputType", inputType); 

if(ageInput != null) { 
    query.setParameter("ageInput", ageInput); 
} 

return (List<User>) query.list(); 
+1

仔细考虑sql注入。我将使用类别框架/休眠 –

相关问题