Jpa Criteria查询

时间:2017-09-19 04:19:34

标签: spring-mvc jpa spring-data

我有一张桌子

  

客户(姓名,性别,州,年龄,城市)

我希望通过

的组合过滤我的客户表
  

(性别,州,城市,年龄)

用户可以输入任何一个,两个,三个或四个过滤条件。我坚持写这个标准查询我怎么能​​这样做?

package com.thoughtclan.segmentationofcustomers.specification;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.data.jpa.domain.Specification;

import com.thoughtclan.segmentationofcustomers.model.Customer;

public class FilterCriteria implements Specification<Customer> {

    private SearchCriteria criteria;


    @Override
    public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        // TODO Auto-generated method stub

        return null;
    }


}
  

你能解释一下吗?

**

  

这是我的服务类方法

**

public Set<Customer> filterDetails(TargetGroupDto targetGroupDto) {
        // TODO Auto-generated method stub
}

2 个答案:

答案 0 :(得分:0)

您应该将过滤器选项存储在某个类中。而不仅仅是检查它们是否存在并添加标准。

Criteria criteria = session.createCriteria(Customer.class);


    // here you receive some DTO with filter fields

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

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

    criteria.list() // return result

    session.close() // or you can use try-with-resources

答案 1 :(得分:0)

编辑: 由于您的问题稍后更新,我已经在评论中询问了您的JPQL查询。所以这个答案与JPQL有关,而不是标准查询。
您可以使用JPQL query执行此操作。我假设你生成(你可以从your IDE生成)或者创建一个名为Customer的数据库实体类,它有成员

private String name;
private String gender;
private String state;
private Integer age;
private String city;
.... setters and getters

现在在persistent.xml中添加类引用(如果不存在)。

<class>Customer</class> //if additional package exist then give the package name e.g com.test.Customer

现在进入查询部分。

Query q = entityManager.createQuery("SELECT c from Customer c where c.gender=:gender and c.state=:state and c.city=:city and c.age=:age");
q.setParameter("gender", "MALE");//Assume gender value is Male
q.setParameter("state", "Honululu");//Assume state value is Honululu
q.setParameter("city", "abc");//Assume city value is abc
q.setParameter("age", 10);//Assume age value is 10
Object resp = q.getResultList();

现在resp对象包含您的数据。将对象转换为java.util.List以获取数据。

您可以添加一些逻辑来组合您的查询。假设您有一个业务对象CustomerBO实例cbo

if(cbo.getGender()!=null && !cbo.getGender().isEmpty()){
    q.setParameter("gender", cbo.getGender());
}
and so many condition as your wish .....