我有表A,B,C,其中B是添加列的关联表
| A | 1 .. * | B | * .. 1 | C |
包含B实体列表的实体A
@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
谢谢你的帮助
答案 0 :(得分:1)
似乎这个问题被报告为一个错误。
答案 1 :(得分:0)
你得到这个的原因是Hibernate正在bPk.c.name
中寻找列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不是必需的。
答案 2 :(得分:0)
我试图找到一种方法来引用@CollectionTable
中的一个集合元素,使用hibernate标准一整天!最后我发现了这个:
ElementCollection createAlias in hibernate API
我需要在集合中引用一个基本元素(Integer),希望它也适用于非基本元素。万一有人像我一样迷路,不要放弃并转向HQL,因为有一个解决方案! :)