Hibernate中一对多关系的条件查询HQL怎么写

问题标题写错了,应该是多对多关系。平时都是自己写SQL,几乎没用过Hibernate,很不熟悉,希望达人指教。假设我有一个A表(id,name)对应实体类A,另外有一个B... 问题标题写错了,应该是多对多关系。平时都是自己写SQL,几乎没用过Hibernate,很不熟悉,希望达人指教。
假设我有一个A表(id,name)对应实体类A,另外有一个B表(id,name)对应实体类B,A与B有多对多关系(通过中间表C(aid,bid)两列),所以A类中有一个集合属性放多个B对象。

现在想通过一条HQL查询出以下数据:
集合中存在id为1的B对象的所有A对象。
用普通SQL写就是类似这样的要求:
select A.* from A where exists(select 1 from C where aid=A.id and bid=1)

请教HQL应该如何写?
展开
 我来答
百度网友82a831c
2012-02-13
知道答主
回答量:8
采纳率:0%
帮助的人:3.3万
展开全部
给你举个教师与课程的例子,这就是多对多的关系:
java类:
teacher:
public class Teacher {
private Integer tId;
private String tName;
private Set<Course> courses;
public Integer gettId() {
return tId;
}
public void settId(Integer tId) {
this.tId = tId;
}
public String gettName() {
return tName;
}
public void settName(String tName) {
this.tName = tName;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}

}
Course:
public class Course {
private Integer cId;
private String cName;
private Set<Teacher> teachers;
private Set<Student> students;
public Integer getcId() {
return cId;
}
public void setcId(Integer cId) {
this.cId = cId;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}

hbm文件:
teacher:
<hibernate-mapping package="com.lee.vo">
<class name="Teacher" table="TEACHER">
<id name="tId" type="java.lang.Integer" column="id">
<generator class="native" />
</id>
<property name="tName" type="java.lang.String" column="TNAME"/>
<set name="courses" table="TEACHER_COURSE">
<key column="tId"/>
<many-to-many class="com.lee.vo.Course" column="cId"></many-to-many>
</set>
</class>
</hibernate-mapping>
crouse :
<hibernate-mapping package="com.lee.vo">
<class name="Course" table="COURSE">
<id name="cId" type="java.lang.Integer" column="id">
<generator class="native" />
</id>
<property name="cName" type="java.lang.String" column="CNAME"/>
<set name="teachers" table="TEACHER_COURSE">
<key column="cId" />
<many-to-many class="com.lee.vo.Teacher" column="tId" />
</set>
<set name="students" table="TEACHER_COURSE">
<key column="cId" />
<many-to-many class="Student" column="sId" />
</set>
</class>
</hibernate-mapping>

使用many-to-many 属性,可以直接得到teacher所教的课程,也可以得到某个课程由哪些教师教。
main:
Session se = HibernateUtil.getSession();
Teacher teacher = (Teacher)se.get(Teacher.class,1);
Set<Course> set =teacher.getCourses();
Iterator<Course> it =set.iterator();
while(it.hasNext()){
System.out.println(it.next().getCname());
}
hibernate将sql封装在底层,你不需要直接操作SQL,而是采取面向对象的方式来直接调用,很方便的。
曹_小灿
2012-02-09 · TA获得超过158个赞
知道小有建树答主
回答量:234
采纳率:0%
帮助的人:164万
展开全部
hibernate 最好是 配置多对多的。 不然关系不确定,

hibernate 就是可以配置完之后, SQL语句其实都可以不用写的。
直接从A中get B 得到 B的set
然后通过C。。 知道了吧
追问
配置多对多什么的都搞定,不用考虑。现在的问题是其它配置都做好的前提下,HQL怎么写,而不是通过get集合方法去在java代码中一点点做
追答
select A.* from A where B.id=(select bid from C where C.aid=A.id) and B.id=1; 
不对不对。
有点乱了。 因为我这边还有工作要做。

我搞不懂, 你要查的是所有A的对象。
何必要写HQL。

你的语句好像也没什么问题。

请见谅。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式