【问题标题】:Criteria API JPA标准 API JPA
【发布时间】:2017-04-18 05:03:43
【问题描述】:

我正在尝试在我的 Java Web 应用程序中实现自定义过滤器。 我想实现这样的照片:

但设计更好:))

基本上,我需要使用以下标准过滤数据: 等于、不等于、喜欢、为空、不为空、介于(日期)、大于、小于然后

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

https://docs.oracle.com/cd/E19798-01/821-1841/gjixa/index.html

有这样的代码:

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");

我对我的代码进行了更改,它看起来像这样:

    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();

但不幸的是,.and 在我的代码中无法识别并且编译会引发错误。

所以我的问题是:

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

谢谢

【问题讨论】:

    标签: java hibernate jpa filter filtering


    【解决方案1】:

    在您的代码中,您尝试使用不存在的Predicate 对象中的and 方法,而您需要将andCriteriaBuilder 一起使用,如下所示:

            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();
    

    另外,你可以参考CriteriaBuilderhere的其他方法。

    【讨论】:

    • 如何获得此类结果的计数?我希望能够创建分页,所以我需要获取查询结果的总数,然后只获取前 15 条记录。
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2011-05-04
    • 2018-08-22
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多