急!高分请教hibernate(一对多)多对多查询的问题?!
public class TA extends TObject{
private Set tbs=new HashSet(0);
public Set getTbs() {
return tbs;
}
public void setTbs(Set tbs) {
this.tbs = tbs;
}
}
public class TB extends TObject {
private TA ta;
public TA getTa() {
return ta;
}
public void setTa(TA ta) {
this.ta = ta;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test">
<class name="TA" table="TA">
<id name="id" type="long" column="ta_id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<set name="tbs">
<key column="ta_id"></key>
<one-to-many class="TB" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test">
<class name="TB" table="TB" polymorphism="explicit">
<id name="id" type="long" column="tb_id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<many-to-one name="ta" column="ta_id" class="TA" />
</class>
</hibernate-mapping>
如上面是Java文件和配置文件所示,TObject是提供基本属性(id、name等)及属性的get\set方法的父类,一个TA可以有多个TB,一个TB只能有一个TA。
我的查询语句是“from TA pojo where pojo.tbs.name='tb1'”,可结果报错。
我在网上看到,有人说这样写是正确的,也有人说这样写是错误的,
所以,我想请教下大侠们,这样写到底是正确的还是错误的啊?
如果是正确的,怎么样才能不报错并显示正常查询结果呢?
小弟先谢谢了!
[最优解释]
高版本的Hibernate不能这样查Set了,
要改成这样:
from TA pojo inner join fetch pojo.tbs tb where tb.name='tb1'
[其他解释]
网上这种资料那是相当多的,lz还不如自己查下原因咧!
当初我学的时候也这样,你要懂得原理,具体写法自己百度下就行了。
[其他解释]
我的查询语句是“from TA pojo where pojo.tbs.name='tb1'”,可结果报错。?
应该把错误贴出来 ,不然怎么给你定位
[其他解释]
你自己先测试一下,在你的TA
和TB里都设置哥name属性,看看行不行,如果行的话就说明是继承映射的问题,如果不行的话,那就是配置文件的问题
[其他解释]
String hql = "from TA pojo where pojo.tbs.name= :name";
Query q = session.createQuery(hql);
q.setParameter("name", name);
return q.list();
[其他解释]
set.name ...
看你这个查询还不如用sql
select * from ta where ta.taName='';
[其他解释]
更正一下
如果按ID关联,先查出tbname对应的tb_id 再根据tb_id查
[其他解释]
为了消除语句的歧义。
因为集合可以有自己的属性。
[其他解释]
欢迎加入先锋软件工作室
QQ:xfrjgzs@126.com
MSN:xfrjgzs@hotmail.com
GTalk:xfrjgzs@gtalk.com
Email: xfrjgzs@126.com
本工作室的主要业务是承接、外包、合作开发各种软件项目,根据项目需要,长期招募兼职人员、合作开发伙伴和项目接包人员,诚挚欢迎广大有意向的软件人才加盟合作,有适合您的项目时我们会及时联系您。
目前急需的人才有:Java系服务器端设计开发人员,.net系服务器端和客户端设计开发人员,Web客户端设计开发人员,移动终端软件设计开发人员,优秀美工人员和多媒体制作人员等。
[其他解释]
好像就是从3.2.x开始的,具体记不清了。
既然你顶楼遇到了问题,说明就是的了。
[其他解释]
学习了。。
[其他解释]
先自己顶下!我的Email:tjnxymxx312@126.com
QQ:523975404
MSN:tianjin_123@hotmail.com
[其他解释]
该回复于2010-12-02 17:18:14被版主删除
[其他解释]
为什么高版本的hibernate不能这样啊?不是应该可以向下兼容的吗?
[其他解释]
那是从哪个版本的hibernate开始不可以的啊?我的版本好像是3.2的,是否可以啊?
[其他解释]
⊙⊙b汗
[其他解释]
另外咨询个问题,对于有一对多关系的两个表TA和TB,TB里有一个TA的实例ta,
这种情况下,用join连接查询“select ta from TA ta join ta.tbSet tb where tb.name=?”和
用where连接“select ta from TA ta ,TB tb where ta.id=tb.ta and tb.name=?”
这两种哪个效率高、执行快啊?!
[其他解释]
+1
[其他解释]
该回复于2010-11-29 16:35:13被版主删除
[其他解释]
很难说,直觉会认为join快些。
不过,我知道在SQL Server上,因为数据库引擎自己做优化的原因,这两种查询方式效率一致。
------其他解决方案--------------------
理论上说,你的映射没有任何问题。
但是,你最好把错误贴出来,让大家给你分析一下
[其他解释]
[其他解释]
该回复于2010-12-02 14:39:36被版主删除
[其他解释]
javax.servlet.ServletException: org.springframework.orm.hibernate3.HibernateQueryException: illegal attempt to dereference collection [ta0_.ta_id.tcSet] with element property reference [vv] [from test.TA pojo where pojo.tcSet.vv='tb1']; nested exception is org.hibernate.QueryException: illegal attempt to dereference collection [ta0_.ta_id.tcSet] with element property reference [vv] [from test.TA pojo where pojo.tcSet.vv='tb1']
上面就是错误。
另外问下,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test">
<class name="TA" table="TA">
<id name="id" type="long" column="ta_id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<property name="vv" column="vv" type="string" />
<list name="tbList">
<key column="ta_id"></key>
<list-index column="li" base="0"></list-index>
<one-to-many class="TB" />
</list>
<set name="tcSet">
<key column="ta_id"></key>
<one-to-many class="TC" />
</set>
</class>
</hibernate-mapping>
像这种有序集合(list\map)的关联,如何添加才能使TB表的li这个索引列自增啊,我看网上都是在TA这边添加的,才能自增;如果我在TB这边添加,要如何使TB表里的li这个索引列自增啊?
[其他解释]
求!LZ 如何解决的? ?