Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何使用JPA Criteria Builder编写带有附加计数列的查询_Hibernate_Jpa_Jpa 2.0_Criteria Api - Fatal编程技术网

Hibernate 如何使用JPA Criteria Builder编写带有附加计数列的查询

Hibernate 如何使用JPA Criteria Builder编写带有附加计数列的查询,hibernate,jpa,jpa-2.0,criteria-api,Hibernate,Jpa,Jpa 2.0,Criteria Api,我正在努力编写一个JPA查询,该查询将返回数据库中的所有p对象,并且在它们旁边,我希望有propertyA=1的子对象的计数 SQL查询 选择p.*,从s_表s中选择counts.id 其中p.id=s.p_id,s.propertyA=p_表p中的1 映射: @Entity @Table(name = "t_table") public class PTable{ @Id private String id; @Version privat

我正在努力编写一个JPA查询,该查询将返回数据库中的所有p对象,并且在它们旁边,我希望有propertyA=1的子对象的计数

SQL查询

选择p.*,从s_表s中选择counts.id 其中p.id=s.p_id,s.propertyA=p_表p中的1

映射:

@Entity
@Table(name = "t_table")
public class PTable{
    @Id
    private String id;

    @Version
    private Long version;

    private String subject;
   
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "p_id", referencedColumnName = "id")
    private Set<STable> sSet = new HashSet<>();
}
 
@Entity
@Table(name = "s_table")
public class STable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "p_id")
    private String pId;
  
    private String propertyA;
}
另外,您是否想指出一些用JPA编写复杂查询的好教程

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<PTable> q = cb.createQuery(PTable.class);
Root<PTable> c = q.from(PTable.class);
您还必须更改实体以正确映射关系,双向且懒惰以提高性能,如下所示:

public MyPojo(String pId, Long version, String subject, Long sId, Long count){
    [...]
}
可接受

@OneToMany(mappedBy="p",fetch = FetchType.LAZY)
private Set<STable> sSet;

是否已在实体定义中映射联接关系?给他们看。为什么不使用一个简单的sql查询,比如SELECT s.*,countp.id FROM p_table p JOIN s_table s ON p.id=s.p_id,其中p.propertyA=1 groupby s.id。这样的查询更容易转换为JPQL,JPA CriteriaQueryI添加了映射。此映射已存在于代码中。我必须创建这样的查询。这不清楚,因为您可能希望选择PTable与countSTable之间的关系?哦..对不起,我更正了描述。结果是,我想要数据库中的所有P对象,并且在它们旁边,我想要有propertyA=1的S子对象的计数。
@OneToMany(mappedBy="p",fetch = FetchType.LAZY)
private Set<STable> sSet;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id")
private PTable p;