java - 如何使用动态参数创建 JPA 查询?

标签 java jpa jpql

我有这个方法:

 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/

相关文章:

java - 使用 JPA 的 Apache Server Servlet 上出现 NullPointerException

jpa - 如何使用 JPQL 从连接表中删除条目?

java - 使用 NEW 时在 JPQL 中进行转换

spring - JPA JPQL IN 子句 : How to use IN clause in JPA?

java - 这是否意味着二进制搜索算法?

jpa - 为什么 <exclude-unlisted-classes>false</exclude-unlisted-classes> 无法工作?

java - 在 java hibernate 中,父 id 不插入到具有一对多关系的子表

JavaFX 使用 GridPane 创建游戏板

java - JVM G1GC 的混合 gc 没有收集太多旧区域

java - 可扩展类的哈希码(面向 future )