2011-10-23 58 views
2

我有两个表在我的DB,T1和T2。 T1的一列是引用T2的外键。我只需要T1和T2的一部分列进行处理,因此我创建了一个只包含必要列的DTO T1T2。为了使用Hibernate将DTO映射到这两个表,我使用了类元素的subselect属性。只读多DTO +休眠

<hibernate-mapping> 
<class 
    name="com.xconnect.cdrrecorder.processing.dto.IngressNumRuleVoipProfile" 
    table="numbermodificationrules" 
    subselect="select ... from T1 left join T2 on id1=id2 where ..."> 

    <cache usage="read-only"/> 

... 

</class> 
</hibernate-mapping> 

我注意到,当我需要选择一个对象时,Hibernate将请求转换为两个选择(一个到另一个)。

有没有更好的方法来做到这一点?你对演出有什么看法?

感谢

回答

4

如果要创建一个DTO,更好地从查询填补了DTO作为一个例子here。如果有备份表,只创建实体。

如果经常使用DTO,您可以在数据库中编写视图并创建一个简单的DTO实体来引用该视图。由于视图是在DB中预编译的,所以速度会更快。

+0

感谢您的回答。在这[链接](http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html)(5.1.1节)中,解释了使用子选择。我的问题是,在哪些情况下,我们需要使用子查询来代替其他查询方式? –

+0

正如链接中所述,_有时您想使用视图,但不能在数据库中创建一个视图(即使用传统模式)。在这种情况下,您可以将不可变且只读的实体映射到给定的SQL子查询表达式_。如果可以的话,去看看。 – ManuPK