hibernate多对多过滤
Ⅰ hibernate 多对多查询
两种方法,既然你要hql语句就写hql语句的吧:
select b from B as b,A as a where b.as=a.id and a.type=1
因为是对象,所以在比较时是以B的as来比专较A.id;
这样即使查出了数据也会存在懒加载属异常的问题,关于那个问题你可以在发帖子询问.
上句不行用下句:
select b.id ,b.as from B as b,A as a where b.as=a.id and a.type=1;
因为查出来的是对象类型数组,所以在遍历时需要花点心思,不过懒加载异常就不存在了.
如何遍历网上很多,实在找不到,继续发帖.
Ⅱ Hibernate 多对一和一对多嵌套,会查出很多数据怎么办
那就延迟加载
在xml 的 集合标签上 加上 lazy="true",hibernate默认就是开启了的
<set lazy="true" .....
Ⅲ hibernate 多对一,一对多,多对多, 在JAVA中怎么理解呢
首先我要告诉你,数据库描述表之间的关系是通过外键描述的,中是通过属性描述的。
外键是什么意思?举个例子说,数据库中,你有个表是学生表,
我们简单点说有三列,一个是学生的id,一个是姓名,一个是班级的id
而在数据库中,你会建一个班级表,
其中有id和班级的名称,比如计算机三班,二班等等。
班级和学生,班级是一,学生是多。
而在hibernate中,为了简单起见,一般会在学生类中将班级属性设置成一个班级类,而在班级类中额外添加一个list或者set。这么做的好处简单来说,是为了方便。
怎么方便呢?
这么说吧,比如我们没这么设置,而是在学生类中只有一个班级的id,那么你查到一个学生,想看他班级的名称,是不是还要根据班级的id,去班级表查找对应的名字,这么一来,就会十分麻烦,所以在hibernate中,如果表中有外键,那么一般会将这个外键设置成那个表的实体类,这样一来,我们就不需要多那一步了。
至于你说为什么将属性设置到班级的对象,然后保存学生的信息,学生表中就有班级id这个字段的值了,这个问题,很简单,因为你不仅把属性保存到班级对象中了,你肯定还把这个班级对象作为属性设置给学生了,所以就有了。
换句话说,你等于还是间接的设置了班级id,这个字段,具体他们的对应关系,自然是在配置文件中显示的。
不知道说了这么多,你能理解不。
手酸了,,,,希望对你有帮助。。。
Ⅳ hibernate 多对多HQL语句
类似于:
select score.price from Score score where score.stu.id="学生编号"
and score.sub.id="科目编号"
-------------------------------
补充一点,一般来说你这个成绩表应该很多数据,如果这么用实体关联查询速度不是最快,建议是用SQL语句查询
Ⅳ Hibernate多对多级联查询的问题
最好用一对多的关系来代替多对多的关系。也就是把中间表也单独建一个类来。这样控制方便,效率高。
Ⅵ 列举Hibernate中多对多,一对多关系的配置
多对多配置
A方
<set name="A" cascade="all" inverse="false"
table="t_A">
<key
column="cid"></key>
<many-to-many class="ClassB"
column="ca"></many-to-many>
</set>
B方
<set name="B" cascade="all" inverse="true"
table="t_B">
<key
column="sid"></key>
<many-to-many class="ClassA"
column="cb"></many-to-many>
</set>
fetch 可以设置 "select" 和 "join“
在一对多中
fetch =
"select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句;
说的详细点就是:在执行hql的时候,实际上会先执行一条select * from tableA ....-->然后根据查 询的结果去tableB里面查询(也是一条一条查询,会产生n条语句)
fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象,只会有1条sql语句
在执行hql的时候实际上执行的是一句多表查询语句 select * from tableA a left join tableB b.....
cascade 简单一些
cascade属性的可能值有,all none save-update delete 他们的含义如下
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。默认为none。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
Ⅶ Hibernate中多对多关系如何查询
今天遇到了HIbernate中的抄多对袭对查询问题,由于多对多的关系在实体中都是集合:所以查询时的方式有所不同:代码如下:public List<String getListNameByPtyg() { String sql="select t.trueName from KhUsers t join t.dictionaryInfos as s where s.name='普通员工' and s.fenleiCode='B'"; Query query=super.getSession().createQuery(sql); List<String result=query.list(); return result;}注意:1。查询的字段如trueName前面必须加上表的别名 2。t.dictionaryInfos as s:dictionaryInfos是实体中集合对象的名称,后面的s其实是实体单个对象,where条件中就是以这个对象的字段条件查询的。
Ⅷ hibernate多对多性能的问题
使用HIBERNATE建议尽量不要用集合映射及继承映射等,有关联的实体只记录外键,需要的时候根据外键加载实体,这样不会造成性能问题
Ⅸ Hibernate中多对多关系的条件查询HQL怎么写
不用那么麻烦的。
其实你学过Hibernate的级联查询就非常简单的。
比如:只查询表A就行了,但必须在A的映射文件里
加上一个lazy="false"才行的。
试一试看看。。。
Ⅹ Hibernate 多对多怎么删除关联
当你完成了多对多的映射,并且在映射文件对应的set(或这list,map)中开启了级联内删除(即casecade=delete,大概这样),就可容以在测试类中,使用get方法获得对象,在使用set(或者list,map)的对呀删除单个或全部元素的方法,例如list的remove(),removeAt(int index),map的remove( object key),最后在将get的对象使用session.update()方法即可完成级联删除。可以开启控制台打印sql语句,检查是否删除。