Java 用于动态查询的JPA标准生成器

Java 用于动态查询的JPA标准生成器,java,c#,hibernate,criteria-api,Java,C#,Hibernate,Criteria Api,我必须编写一个方法,在其中传递一些参数,并根据哪些参数为空,修改我需要在最后执行的查询 例如,如果我想从具有ID、name、姓氏和address的表Customer中进行选择,则开始查询将是select*from Customer,其中ID=myId,name=myName,姓氏=myurname(现在我们检查我发送的地址是否为空,如果不是,则将其添加到查询中) 我知道如何在C#中做到这一点,只需做一个起始字符串,然后添加到其中,并直接使用ExecuteStoreQuery,但在Java中这会是

我必须编写一个方法,在其中传递一些参数,并根据哪些参数为空,修改我需要在最后执行的查询

例如,如果我想从具有
ID
name
姓氏
address
的表
Customer
中进行选择,则开始查询将是
select*from Customer,其中ID=myId,name=myName,姓氏=myurname
(现在我们检查我发送的地址是否为空,如果不是,则将其添加到查询中)

我知道如何在C#中做到这一点,只需做一个起始字符串,然后添加到其中,并直接使用ExecuteStoreQuery,但在Java中这会是什么样子?Criteria Builder是一个可行的工具吗


非常感谢!

使用CriteriaQuery,可以执行类似的操作(使用静态JPA元模型类):


非常感谢!我现在将尝试实现它。如果我可以问一个后续问题,为什么要放置Customer_u2;.ID?当我尝试这样做时,我在IntellijI中得到一个错误,使用静态元模型类访问Customer的属性。也许看一下可以帮助您。我添加了另一个示例,我认为在没有元模型类的情况下应该可以工作。
public List<Customer> findCustomer(Long myId, String myName, String mySurName, String myAddress) {
    CriteriaBuilder cb = enitityManager.getCriteriaBuilder();
    CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
    Root<Customer> root = query.from(Customer.class);

    List<Predicate> predicates = new ArrayList<>();
    predicates.add(cb.equal(root.get(Customer_.ID), myId));
    predicates.add(cb.equal(root.get(Customer_.NAME), myName));
    predicates.add(cb.equal(root.get(Customer_.SURNAME), mySurName));

    if(address != null) {
        predicates.add(cb.equal(root.get(Customer_.ADDRESS), myAddress));
    }

    query.select(root).where(cb.and(predicates.toArray(new Predicate[0])));

    return entityManager.createQuery(query).getResultList();
}
public List<Customer> findCustomer(Long myId, String myName, String mySurName, String myAddress) {
    CriteriaBuilder cb = enitityManager.getCriteriaBuilder();
    CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
    Root<Customer> root = query.from(Customer.class);

    List<Predicate> predicates = new ArrayList<>();
    predicates.add(cb.equal(root.get("ID"), myId));
    predicates.add(cb.equal(root.get("name"), myName));
    predicates.add(cb.equal(root.get("surename"), mySurName));

    if(address != null) {
        predicates.add(cb.equal(root.get("address"), myAddress));
    }

    query.select(root).where(cb.and(predicates.toArray(new Predicate[0])));

    return entityManager.createQuery(query).getResultList();
}