Java 将PosgreSQL转换为标准API

Java 将PosgreSQL转换为标准API,java,spring-data-jpa,hibernate-criteria,criteria-api,criteriaquery,Java,Spring Data Jpa,Hibernate Criteria,Criteria Api,Criteriaquery,在我的spring应用程序中,我有两个表。在工人中,有老板,两个角色都可以制作物品。 我想知道在11.9.10之后有多少物品是由明确的老板工人制作的(包括老板物品)(例如,在方法上应该是可变的) 所以方法应该是 public Long fingCountByDateAndWorker(Worker-Worker,即时日期) 这里是老板、工人和创建项目的日期 我通过PostgreSQL中的脚本获得了正确的值,但我无法根据标准API(Java)生成正确的代码 以下是脚本: select distin

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

public Long fingCountByDateAndWorker(Worker-Worker,即时日期)
这里是老板、工人和创建项目的日期

我通过PostgreSQL中的脚本获得了正确的值,但我无法根据标准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代码


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

public Long findCountByDateAndWorker_WorkerId(Instant date,Long workerId)

对于给定的表,您的实体将如下所示:

@实体
公社工人{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多酮
工人老板;
...
}
@实体
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@奥内托内
工人;
本地日期创建;
...
}
然后,您可以在方法中尝试以下内容:

public Long findCountByDate和Worker(Worker-Worker,LocalDate-date){
长结果=0l;
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Long.class);
根r=cq.from(项类);
cq.选择(cb.计数(r))。其中(cb.和(
cb.or(cb.equal)(r.get(项目工人),工人),
cb.equal(r.get(项目工人)。get(工人老板),工人)),
cb.greaterThanOrEqualTo(r.get(Item_u.dateCreate,date));
TypedQuery=em.createQuery(cq);
试一试{
结果=query.getSingleResult();
}catch(NoResultException nre){}
返回结果;
}