我有这个方法:
public List<User> getReport(String name, int age, String sName, Date bd,
String address, String msg2, int first, int pageSize) {
List<User> result = new ArrayList<>();
result = em.createQuery("from User u, User.class)
.setFirstResult(first)
.setMaxResults(pageSize)
.getResultList();
return result;
}
现在,此方法返回所有数据。我需要动态设置参数。我可以做到:
result = em.createQuery("from User u WHERE u.age = :age", User.class)
.setParameter("age", age)
.setFirstResult(first)
.setMaxResults(pageSize)
.getResultList();
但是如果我的 age
为 null - 我得不到结果。以及其他字段。
我需要这样的东西:
if(age != null){
em.createQuery("from User u WHERE u.age = :age", User.class)
.setParameter("age", age)
}
if(name!= null){
em.createQuery("from User u WHERE u.age = :age AND u.name= :name", User.class)
.setParameter("age", age)
}
我可以像这样格式化字符串查询:
String query = "from User u WHER";
然后他们连接这个字符串
if(age != null){
query = query +"u.age = :age";
em.createQuery("from User u WHERE u.age = :age", User.class)
.setParameter("age", age)
}
但我认为这是不好的做法。
最佳答案
当我创建动态查询时,所有参数都在获取 map 。
你可以试试:
public List<User> getReport(String name, Integer age, String sName, Date bd,
String address, String msg2, int first, int pageSize) {
Map<String, Object> paramaterMap = new HashMap<String, Object>();
List<String> whereClause = new ArrayList<String>();
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select u from User u ");
if (!name.isEmpty()){
whereClause.add(" u.name =:name ");
paramaterMap.put("category", category);
}
if (age != null){
whereClause.add(" u.age =:age ");
paramaterMap.put("age", age);
}
if (!sName.isEmpty()){
whereClause.add(" u.sName =:sName ");
paramaterMap.put("sName", sName);
}
if (bd != null){
whereClause.add(" u.bd =:bd ");
paramaterMap.put("bd", bd);
}
if (!address.isEmpty()){
whereClause.add(" u.address =:address ");
paramaterMap.put("address", address);
}
if (!msg2.isEmpty()){
whereClause.add(" u.msg2 =:msg2 ");
paramaterMap.put("msg2", msg2);
}
queryBuilder.append(" where " + StringUtils.join(whereClause, " and "));
Query jpaQuery = entityManager.createQuery(queryBuilder.toString());
for(String key :paramaterMap.keySet()) {
jpaQuery.setParameter(key, paramaterMap.get(key));
}
jpaQuery.setFirstResult(first)
jpaQuery.setMaxResults(pageSize)
return jpaQuery.getResultList();
}
关于java - 如何使用动态参数创建 JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304902/