若是实体查询用到了left,则会为每一个left的实体生成独立的sql语句并对应于对象,结果list获得object泛型数组,object中包含若干对象
在left的过程当中,若是左关联致使的为空的一项做为查询条件,原本就会查询不出致使主表无数据显示,因此,条件查询中尽管用
gc.ooo.xxx便可!
record:
//左关联并不必定要用于select中
//list中包含三个,customer shop operator
List<GesCustomer> temList =new ArrayList<GesCustomer>();
could not initialize proxy - no Session
检查下有没有加@transactional
另外,这个主要是须要获取关联的对象,可是想去获取,但是根本没有取得操做,通常的加上Hibernate.init ,或其它操做便可
这是一个精典的问题:
由于咱们在hibernate里面load一个对象出来时,用到的是代理对象,也就是说当咱们在执行load方法时并无发sql语句,而是返回一个proxy对象。只有当们具体用到哪一个get**方法时才会发sql语句,才会去数据库查。可是当咱们把打开session,关闭session交给了srping去作时,当们load完以后咱们的session就会被srping关闭,若是咱们在jsp页面或者其它的地方再去用get方法取值时就会报这个错误。
解决方法一:但若是咱们在hibernate用get方法就能够解决取单个对象的问题,由于get方法直接发sql语句,把咱们想的数据从数据库中get出来而后放在内存中。
若是咱们取单个对象能够用get方法没有问题;可是若是咱们取的的对象还有关联对象时用get就有问题,由于它不会把关联的对象取出来,但若是页面上用到关联的对象时也会报no session的问题
解决方法二:用到srping的filter(要加在strutsfilter有前面,由于它也有前后顺序,有先进先出的原则)
在咱们的web.xml里面加上
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样作就是让opensession closesession全交给视图部分,最后视图部分用完了session再去关session就不会有上面的错误了
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance
before flushing: com.gjw.entity.building.GesBuilding
通常这种状况是由于保存时从数据库中获取的游离对象中的对象不为空,可是其ID却为空。
Could not read entity state from ResultSet : EntityKey
是由于数据库的字段与实体的属性不匹配,好比实体中应该是manyto,而数据库中是varchar
hibernate查询过滤:
一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同窗拥有.
要查询教拥有书"a"的学生的老师!HQL如何写呀?如何取值?
class teacher{
String id;
String name;
Set students;
}
class student{
String id;
String name;
Set teachers;
Set books;
}
class book{
String id;
String name;
Set students;
}
================================
这种写法(t.students)确定是能够的,你试试
SELECT t FROM teacher t join t.students s join s.books b where b.name = 'a'
================================
SELECT t FROM teacher t where t.students.books.name = 'a'
首先students.books这里,students是集合,因此这个表达式是确定不对的
同理books.name也不对
================================
SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
这种方法没有出错!不过这种方式要用子查询!
================================
是的,element(Set)和indice(List)均可以取集合中的元素,但用在where子句的条件是须要数据库支持子查询,mysql就不行
另外t.students s中s并非集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内链接关
系
================另外一篇文章,和上面的结合就ok了================
今天在作一个项目须要作到Set集的数据过虑,由于在获取一个User的时候不能将属于这个User的Knowledge所有取出,再一个一个地筛选符
合条件的Knowledge,这样作会在很大的程度降底系统性能。
在 Hibernate中类型为Set、List的实体属性也是能够链接查询的,例如User里面有一个Set<Knowledge> knowledge属性要获取User中
Knowledge的isShared的属性为true的User而且在返回的User中的knowledges 中包含isShared为true的Knowledge对象的时候,就要通Set的
过虑查询(左链接查询),在hibernate3.2.3之后的写法如 下:
select distinct u from User u left join fetch u.knowledges k where k.isShare=true。
这样就只会获取knowledge的isShared为true的User,而且User里面的knowleges中包含knowledge的isShared为true的Knowlege对象。
需 要注意的是:关键字distinct和fetch。要实现上面的数据过虑就得要这两个关键字。第一个关键字是独立的意思,第二个关键字是以一
条sql语句 执行。若是少了fetch这个关键字,则达不到目的。返回的结果是一个User包含isShared为true和false的knowledge集合。
同理,若是Knowledge里面还要Set、List属性,而且也要据根这些属性中的对象的某些属性约束查询的话(二级或三级链接查询),也是一
样能够作到的。
object references an unsaved transient instance - save the transient instance before flushing: com.gjw.entity.area.GesArea
这个问题是因为保存的时候对象的id为空,可是这个对象不为空