【问题标题】:Convert PosgreSQL to Criteria API将 PostgreSQL 转换为标准 API
【发布时间】:2021-01-11 17:35:49
【问题描述】:

在我的 spring 应用程序中,我有两个表。在工人中,有老板,两个角色都可以制造物品。 我想知道有多少项目是由确定的老板工人(包括老板项目)在 11.9.10 之后制造的(例如,它应该在方法上是可变的。) 所以方法应该是

public Long fingCountByDateAndWorker(Worker worker, Instant date) 这里是老板工人和创建项目的日期

我通过 PostgreSQL 中的脚本获得了正确的值,但我无法通过 Criteria API (Java) 生成正确的代码 这是脚本:

select distinct COUNT(item.id) FROM worker w1
JOIN worker w2 ON w1.id = w2.boss_id
JOIN item it ON it.date_create >= '2020-01-10 15:51:33'
and (it.worker_id = w2.id or it.worker_id = 2(boss worker id))
where w1.id = 2(boss worker id)

如何转换成java标准API代码?

【问题讨论】:

    标签: java spring-data-jpa hibernate-criteria criteria-api criteriaquery


    【解决方案1】:

    使用给定的表格,您的实体将是这样的:

    @Entity
    public class Worker{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @ManyToOne
        Worker boss;
    
        ...
    
    }
    
    
    @Entity
    public class Item{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @OneToOne
        Worker worker;
    
        LocalDate dateCreate;
    
        ...
    
    }
    
    

    然后你可以在你的方法中尝试这样的事情:

    public Long findCountByDateAndWorker(Worker worker, LocalDate date){
        Long result = 0l;
    
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
        Root<Item> r = cq.from(Item.class);
        cq.select(cb.count(r)).where(cb.and(
                            cb.or(cb.equal(r.get(Item_.worker), worker),
                                  cb.equal(r.get(Item_.worker).get(Worker_.boss), worker)),
                            cb.greaterThanOrEqualTo(r.get(Item_.dateCreate, date))));
        
        TypedQuery<Long> query = em.createQuery(cq);
        
        try{
            result = query.getSingleResult();
        }catch(NoResultException nre) {}
        
        return result;
    }
    

    【讨论】:

      【解决方案2】:

      您必须指定父实体的 id。请尝试以下方法

      public Long findCountByDateAndWorker_WorkerId(Instant date,Long workerId)
      

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多