【问题标题】:JPQL check in parameter not null and then execute queryJPQL check in parameter not null 然后执行查询
【发布时间】:2014-12-28 15:52:45
【问题描述】:

我有一些参数可以为空,也可以不为空。

我想要做的是只使用不为空的参数执行查询。

例如我有:

String param1;
String param2;

我想做这样的事情:

 If ( param1 != null && param2 != null ) {
    Query q = em.createQuery("SELECT a FROM Advert where a.property = param1 and a.property2= param2);
 }

 if( param1 == null && param2 != null ) {
    Query q = em.createQuery("SELECT a FROM Advert where  a.property2= param2")
 }

 if( param1 != null && param2 == null ) {
    Query q = em.createQuery("SELECT a FROM Advert where  a.property= param1");
 }

是否可以不使用 if 语句来做到这一点 但使用 jpql 查询字符串? (因为我有两个以上的参数,查看这么多情况不太方便)

【问题讨论】:

  • 这就是条件 API 的用途:动态构造查询。

标签: java jpa jpql


【解决方案1】:

你可以有这样的东西:

        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Advert> query = criteriaBuilder.createQuery(Advert.class);
        Root<Advert> advertRoot = query.from(Advert.class);         
        query.select(advertRoot);
        List<Predicate> criteria = new ArrayList<Predicate>();
        if(property != null){
            ParameterExpression<String> p =
                    criteriaBuilder.parameter(String.class, "property");
            criteria.add(criteriaBuilder.equal(advertRoot.get("property"), p));
        }
        if(property1 != null){
            ParameterExpression<String> p =
                    criteriaBuilder.parameter(String.class, "property1");
            criteria.add(criteriaBuilder.equal(advertRoot.get("property1"), p));
        }
        if (criteria.size() == 0) {
            throw new RuntimeException("no criteria");
        } else if (criteria.size() == 1) {
            query.where(criteria.get(0));
        } else {
            query.where(criteriaBuilder.and(criteria
                    .toArray(new Predicate[0])));
        }
        TypedQuery<Advert> q = em.createQuery(query);
        //set your query parameters here
        if (property != null) { q.setParameter("property", property); }
        if (property1 != null) { q.setParameter("property1", property1); }
        List<Advert> resultList = q.getResultList();

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多