继承在hibernate中的实现,如何用criteria检索每个子类里相同的字段?

wallflower 2008-07-24 05:30:05
按道理讲子类里相同的字段应该放在父类里统一继承下来,但是已经是这样了。。我也没办法
问题:要检索出所有子类表当中RequestMessage 字段符合条件的记录,但是现在只能检索出from条件里join的第一张表的记录

# <hibernate-mapping default-lazy="false">
# <class name="com.fortinet.service.platform.domain.models.service.AbstractServiceMessageVO" table="MESSAGE">
# <id name="serviceMessageID" type="long" column="ServiceMessageID">
# <generator class="native"/>
# </id>
#
# <discriminator column="messageType"/>
#
# <property name="messageDateTime" column="MessageDateTime"/>
# <many-to-one name="transaction" column="TransactionID" class="com.fortinet.service.platform.domain.models.TransactionVO" not-null="true"/>
# <many-to-one name="service" column="ServiceID" class="com.fortinet.service.platform.domain.models.ServiceVO"/>
#
# <subclass name="com.fortinet.service.platform.domain.models.service.HTTP.HTTPMessageVO" discriminator-value="HTTP_MESSAGE">
# <join table="HTTP_MESSAGE">
# <key column="ServiceMessageID"/>
# <property name="requestMessage" column="RequestMessage" type="text" />
# <property name="responseMessage" column="ResponseMessage" type="text" />
# </join>
# </subclass>
# <subclass name="com.fortinet.service.platform.domain.models.service.SOAP.SOAPMessageVO" discriminator-value="SOAP_MESSAGE">
# <join table="SOAP_MESSAGE">
# <key column="ServiceMessageID"/>
# <property name="requestMessage" column="RequestMessage" type="text" />
# <property name="responseMessage" column="ResponseMessage" type="text" />
# </join>
# </subclass>
# </class>

生成的部分sql:
select ....
from from TB_SVC_MESSAGE this_ left outer join TB_SVC_SOAP_MESSAGE this_1_ on this_.ServiceMessageID=this_1_.ServiceMessageID
left outer join TB_SVC_HTTP_MESSAGE this_2_ on this_.ServiceMessageID=this_2_.ServiceMessageID
inner join ....
where this_1_.RequestMessage like ? order by this_.MessageDateTime desc
结果是只能选出SOAPMessageVO里符合条件的记录
我现在需要所有子类里requestmessage满足条件的记录,即where this_1_.RequestMessage like ? or this_2_.RequestMessage like ?
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wallflower 2008-07-30
  • 打赏
  • 举报
回复
这样啊,我再想想好了。。
多谢Landor2004,结贴送分
Landor2004 2008-07-29
  • 打赏
  • 举报
回复
这么写逻辑就有问题,用离线Criteria写不出来或者写起来很麻烦,生成的语句也不是你想要的,因为由于设计的错误,导致现在是两个字段,你这么join起来,也是两个字段,建议你写两个criterial,得到结果集之后,合并一下

或者直接用createSQLQuery直接用union写
wallflower 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Landor2004 的回复:]
你的查询是怎么写的呢
[/Quote]

如下:
DetachedCriteria criteria = DetachedCriteria.forClass(AbstractServiceMessageVO.class);
criteria.add(Property.forName("requestMessage").like("%" + postData.getRequestMessage() + "%"));
criteria.add(Property.forName("responseMessage").like("%" + postData.getResponseMessage() + "%"));
Landor2004 2008-07-29
  • 打赏
  • 举报
回复
应该这样就可以吧

DetachedCriteria criteria1 = DetachedCriteria.forClass(HTTPMessageVO.class);
......
DetachedCriteria criteria2 = DetachedCriteria.forClass(SOAPMessageVO.class);
......
wallflower 2008-07-29
  • 打赏
  • 举报
回复
本来是想利用hibernate对继承的这套支持的,但是这么设计就有问题,没办法了

Landor2004所说的两个criterial,好像我得抛弃现在的这种继承体系了 ,重新改写配置文件?
Landor2004 2008-07-25
  • 打赏
  • 举报
回复
你的查询是怎么写的呢

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧