Java 标准API JPA

Java 标准API JPA,java,hibernate,jpa,filter,filtering,Java,Hibernate,Jpa,Filter,Filtering,我试图在Java web应用程序中实现自定义过滤器。 我想实现像这张照片一样的目标: 但设计更好:)) 基本上,我需要使用以下标准过滤数据: equal,not equal,like,为空,不为空,介于(日期)之间,大于,小于 所以出于我的原因,我决定使用CriteriaAPI。 我以前从未使用过criteria API,因此我正在阅读官方文档: 有这样的代码: CriteriaQuery<Pet> cq = cb.createQuery(Pet.class); Metamode

我试图在Java web应用程序中实现自定义过滤器。 我想实现像这张照片一样的目标:

但设计更好:))

基本上,我需要使用以下标准过滤数据: equal,not equal,like,为空,不为空,介于(日期)之间,大于,小于

所以出于我的原因,我决定使用CriteriaAPI。 我以前从未使用过criteria API,因此我正在阅读官方文档:

有这样的代码:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.where(cb.equal(pet.get(Pet_.name), "Fido")
.and(cb.equal(pet.get(Pet_.color), "brown");
CriteriaQuery cq=cb.createQuery(Pet.class);
元模型m=em.getMetamodel();
EntityType Pet=m.entity(Pet.class);
根pet=cq.from(pet.class);
cq.where(cb.equal(pet.get(pet.name),“Fido”)
和(cb.equal(pet.get(pet_.color),“brown”);
我对代码进行了更改,结果如下所示:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Client> cq = cb.createQuery(Client.class);
    Root<Client> client = cq.from(Client.class);
    cq.where(cb.equal(client.get("firstName"), "Fido").and(cb.like(client.get("lastName"), "brown")));
    TypedQuery<Client> q = em.createQuery(cq);
    List<Client> allClients = q.getResultList();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Client.class);
根客户端=cq.from(client.class);
其中(cb.equal(client.get(“firstName”),“Fido”)和(cb.like(client.get(“lastName”),“brown”));
TypedQuery q=em.createQuery(cq);
List allClients=q.getResultList();
但不幸的是,
在我的代码中无法识别,编译会抛出错误

因此,我的问题是:

  • 我是否选择了正确的数据过滤方法
  • 我的代码有什么问题

  • 感谢

    在您的代码中,您正试图使用
    谓词
    对象中不存在的
    方法,而您需要使用
    CriteriaBuilder
    ,如下所示:

            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Client> cq = cb.createQuery(Client.class);
            Root<Client> client = cq.from(Client.class);
    
            //Pass all conditions to CriteriaBuilder 'and'
            Predicate predicate = cb.and(cb.equal(client.get("firstName"), "Fido"),
                       cb.like(client.get("lastName"), "brown")); 
            cq.where(predicate);
    
            TypedQuery<Client> q = em.createQuery(cq);
            List<Client> allClients = q.getResultList();
    
    CriteriaBuilder cb=em.getCriteriaBuilder();
    CriteriaQuery cq=cb.createQuery(Client.class);
    根客户端=cq.from(client.class);
    //将所有条件传递给CriteriaBuilder'和'
    谓词=cb.and(cb.equal(client.get(“firstName”),“Fido”),
    cb.like(client.get(“lastName”),“brown”);
    cq.where(谓词);
    TypedQuery q=em.createQuery(cq);
    List allClients=q.getResultList();
    

    另外,您可以参考
    CriteriaBuilder

    的其他方法如何获取此类结果的计数?我希望能够创建分页,因此我需要获取查询结果的总计数,然后仅获取前15条记录。