如何在Hibernate中为@oneToMnay左联接设置projectionList / resultTransformer

时间:2019-07-20 00:24:42

标签: hibernate jpa projection

我有3个实体,A,B,C。
1,A <----> B
A和B之间的关系为@OneToOne
2,A <----> C
A和B之间的关系为@OneToMany
3,B <-X-> C
B和C之间没有关系

我已经有了像这样的实体代码:

public class A {
    @Id
    @Column(name = "id")
    private Integer id;

    @Transient
    private String bData;

    @OneToOne(mappedBy = "a")
    private B b;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
    private Collection<C> cs = new LinkedHashSet<>();
}

public class B {
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = 'data')
    private String data;

    @OneToOne
    @JoinColumn(name= "id", insertable = false, updatable = false)
    private A a;
}

public class C{
    @EmbeddedId
    private EmbdId embdId;

    @ManyToOne
    @JoinColumn(name = "id")
    @MapsId("id")
    private A a;
}

public class EmbdId{
    @Column(name = "id")
    private Integer id;    

    @Column(name = "another_Id")
    private Integer another_Id;    
}

我也有这样的实体A的条件和投影:

private Criteria createACriteria() {
        return hibernateDaoMap.get(A).createCriteria("a")
                .setFetchMode("B", FetchMode.SELECT)
                .setFetchMode("C", FetchMode.SELECT)
                .createAlias("a.b", "b", JoinType.LEFT_OUTER_JOIN)
                .createAlias("a.cs", "cs", JoinType.LEFT_OUTER_JOIN)
//not sure if 
                .setProjection(projectionList()
                        .add(property("a.id"), "id")
                        .add(property("b.data"), "bData")
                        .add(property("cs"), "cs")                  
                        .setResultTransformer(Transformers.aliasToBean(A.class));
        }

现在,我已经在A和B之间建立了映射,但是A和C之间没有建立映射。

通过A查询id时,我得到了返回的a的多个实例,但是具有相同的ID。该数字恰好是与c相匹配的实例id的数量

我想要的是a的一个实例,但是A实体中有一组不同的c

0 个答案:

没有答案