我得到了Cat实体,它是父母,CatDts是一对多的儿童收藏品。 我想让所有拥有CatDt.name ='a'的猫。生成的sql查询是正确的但是在访问CatDts集合时,将返回所有子rec,而不仅仅是名为'a'的子rec。感谢任何帮助,谢谢!
表格
Cat CatDt
id id name cat_id
---- --- --- ---
1 100 a 1
2 101 a 2
102 xyz 2
所以我只需要1-100,2-101,但它也给了我2-102
Cat实体
private List<CatDt> catDts = new ArrayList<CatDt>();
@OneToMany(fetch = FetchType.LAZY, mappedBy = "cat", cascade=CascadeType.ALL)
public List<CatDt> getCatDts() {
if(this.catDts==null){
this.catDts = new ArrayList<CatDt>();
}
return this.catDts;
}
CatDt实体
private Cat cat;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinColumn(name = "CAT_ID", nullable = false)
public Cat getCat() {
return this.cat;
}
服务
public List<Cat>findAllByOption(CatOption options){
QCat cat = QCat.cat;
QCatDt catDt = QCatDt.catDt;
List<Cat> cats = jpaQueryFactory.selectFrom(cat)
.innerJoin(catDt).on(cat.id.eq(catDt.cat.id).and(catDt.name.eq("a")))
.where(cat.status.eq(new BigDecimal(0))).fetch();
return cats;
}
测试
@Test
public void testCatWithOptionsJpaQuery(){
CatOption options = new CatOption();
options.setStatus(new BigDecimal(0));
options.setName("a");
List<Cat> catList = catService.findAllByOption(options); //-->returns 2 rows
for(Cat cat:catList){
logger.info("--" + cat.toString()); //-->gets the child collection catDts and pulls out all rows, not just constrained ones
}
Assert.notNull(catList, "categories returned cannot be null!");
}
我检查日志并在下面的Test行中查找sql查询&amp;加入是好的,只返回2行Cat。
catService.findAllByOption(options)
但是,当我迭代这两个Cat对象时,Hibernate会删除所有相应的CatDt子集合(总共3个)。 那么如何才能获得名称为'a'的子记录?
更新1
当执行到达Test中循环内的行之下时,它会抛出单个select语句,这就是3条记录的返回方式而不是2.我认为这是orm应该如何工作但是如何得到限制儿?
logger.info("--" + cat.toString())
答案 0 :(得分:0)
所以我通过创建一个pojo来保存我需要的所有连接结果字段来解决这个问题。
我的服务/回购使用querydsl加入&amp;过滤,返回pojo列表。
我认为Hibernate非常适合使用一个表格,但对于复杂的连接和结果,我们可以使用自定义对象和Querydsl。
或者我也可以通过父母循环并使用Hibernate的@Filter。