Hibernate会提取父项的所有子记录,而不仅仅是受约束的子项

时间:2017-03-13 08:28:22

标签: hibernate spring-data-jpa querydsl

我得到了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())

1 个答案:

答案 0 :(得分:0)

所以我通过创建一个pojo来保存我需要的所有连接结果字段来解决这个问题。

我的服务/回购使用querydsl加入&amp;过滤,返回pojo列表。

我认为Hibernate非常适合使用一个表格,但对于复杂的连接和结果,我们可以使用自定义对象和Querydsl。

或者我也可以通过父母循环并使用Hibernate的@Filter。