Java中有一个Person类,然后他有子类Employee,Manager,Cleaner等。
在Person.hbm.xml中建模时我采用了subclass标签,在数据库中有一张Person表,然后其他三张表只是派生了Person所没有的一些属性,通过person_id外键引用Person。
然而我发现如果执行getPersonById操作的话,hibernate会outer join这四张表,导致性能十分底下。
我现在不想使用hibernate的get方法,想改用SQLQuery,首先只查询Person表,找到这个人的类别(type),然后程序中判断type的类型,然后只对Employee,Manager和Cleaner的一张表进行连接。
我的select语句这么写的
session.createSQLQuery("select * from person where id = " + id).addEntity(Person.class);
然后他就报无法找到_clazz属性,这个属性我是从来没有声明过的,如果我把Person.hbm.xml中的sub-class标签全部去掉的话,这个错也消失了。
请问我就像执行纯粹的sql查询语句,只针对Person一张表,这该怎么办。
另给你附个例子:
[code="java"]
这是配置文件:
这是代码:
//多态查询,hibernate能够自动根据辨别字段的取值,自动转换为相应的具体类型。
Animal a = (Animal)session.get(Animal.class, 2);
[/code]
hibernate的继承关联有三种方法:1、单表继承;每棵类继承树一张表;
2、具体表继承;每个子类一张表;
3、类表继承;每个具体类一张表;
那么你使用的是第2种方法了是不?首先我想说当你调用getObjectById的时候hibernate的多态性会根据你传进来的ID加载对象,在加载的过程当中,多态会根据你的配置文件里配置的继承属性去自动封装为该ID对应的对象类型!当然前提是你一定要配置对了!我不知道你的配置文件是怎么配置的,或者说你采用的是哪种继承策略呢?
你使用的我所说的第2种继承策略,按照你所贴出来的配置文件,下面3个子类具体一张表,那么你使用hibernate的session.get()或者session.load()方法的时候,你传一个ID进去,如果你知道这个ID所对应的类型是哪个那就传那个Class,如果不知道你完全可以传父类Class进去,hibernate会根据你传进去的IDget或者load,hibernate的多态在加载过程中能够自动根据辨别字段的取值,自动转换为该ID所对应的具体类型!比如:在你所给出的配置文件中:
[code="java"]
[/code]
代码在这里,刚才点错了给提交了!
[code="java"]
Offer offer = (Offer)session.get(Offer.class,id);
//这个ID随便取值,hibernate发sql语句的时候会根据你所传进去的ID辨别其类型,只会关联父类表和这个ID所对应的表去查询,怎么会关联4张表呢?
[/code]
希望能够帮到你!你所说的查询具体子类的时候,你希望从父类中先把类型查询出来,再根据类型到所对应的具体子类中去查询,那我要说你还不了解hibernate的多态,或者说你如果按照那样做,那你完全没有必要使用hibernate,或者说你完全没有必要做那么多复杂的繁琐的事,hibernate的多态都已经帮你做了!你只需要简单的get或者load就OK了!
还有如果你想写sql语句查询那应该是这样的:
[code="java"]
int id =2;
String sql = "select * from t_animal where id ="+id;
Object[] a =(Object[])session.createSQLQuery(sql).uniqueResult();
System.out.println(a[0]+","+a[1]);
[/code]
哪儿有你那样写的啊,你本身就from一个表了,还又来了个andEntity!