2

我有表 A、B、C,其中 B 是添加列的关联表

| 一个 | 1 .. * | 乙| * .. 1 | C |

实体 A 和 B 实体列表

@Entity
@Table(name = "a")
public class A {
    //id

    @OneToMany(mappedBy="bPK.a", cascade={CascadeType.ALL})
    private List<B> listB; 

    // getters, setters
} 

实体 B 已嵌入 PK

@Entity
@Table(name = "b")
public class B {
    @EmbeddedId
    private BPK bPK; 

    // added columns
    // getters, setters
}

嵌入式主键类:

@Embeddable
public class BPK implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_a", nullable=false)
    private A a;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_c", nullable=false)
    private C c;

    // getters, setters
}

实体 C

@Entity
@Table(name = "c")
public class C {
    @Column(name = "i_c")
    private Long iC;

    @Column(name="name")
    private String name; 

    // getters, setters
}

...并且我想获得这样的对象 A 与具体名称相关联的对象 C

我试图这样做,但它不起作用

Criteria criteria = session.createCriteria(A.class);  
criteria.createAlias("listB", "bList")
criteria.add(Restrictions.like("bList.bPK.c.name", "name", MatchMode.ANYWHERE));

我有以下异常:

org.springframework.orm.hibernate3.HibernateQueryException:无法解析属性:bPK.c.name

谢谢你的帮助

4

3 回答 3

1

似乎这个问题被报告为一个错误。

https://hibernate.atlassian.net/browse/HHH-6963

于 2012-05-11T11:26:26.627 回答
0

bPk.c.name你得到这个的原因是 Hibernate 正在你的 中寻找列bList (A class),显然没有这样的列。您想要实现的目标可以通过我的多个别名来完成(创建别名时,Criteria 也在您当前的表上与该表进行连接)。

因此:

Criteria criteria = session.createCriteria(A.class);  
criteria.createAlias("listB", "bList")
    .createAlias("bList.bPk", "bPk")
    .createAlias("bPk.c", "c")
    .add(Restrictions.like("c.name", "name", MatchMode.ANYWHERE));

我认为 MatchMode.ANYWHERE 是没有必要的。

于 2012-05-07T13:08:03.897 回答
0

我试图找到一种方法来在一@CollectionTable整天的休眠条件下引用集合元素!最后我发现了这个:

休眠 API 中的 ElementCollection createAlias

我需要在集合中引用一个基本元素(整数),希望它也适用于非基本元素。万一有人像我一样迷路了,不要放弃转向HQL,因为有解决办法!!!:)

于 2018-01-31T07:33:46.690 回答