Hibernate - 在on-clause中加入条件

时间:2017-05-29 10:31:54

标签: java hibernate

我想加入2个表并进行查询:
tableA包含列id,数据
tableB与列id,键

说,我在tablea中有一行:

id=5, data='xyz'

和tableb中的两行:

id=5, key='key1'
id=5, key='key2'

现在我想运行以下SQL:

select * from tablea a left outer join tableb b on (a.id = b.id and b.key='key3')

给我一​​行结果:

id=5, data='xyz', key=null

我怎样才能用hibernateTemplate做到这一点?

我尝试使用以下hibernate映射文件:

<hibernate-mapping package="de.xxx.vo">
<class name="zBean" table="TABLEA">
    <subselect>
        SELECT
            a.id, a.data
        FROM
            tablea a
            LEFT OUTER JOIN tableb b on a.id = b.id
    </subselect>

    <id name="id" column="ID" type="long"/>
    <property name="data" column="DATA" type="string" />
    <property name="key" column="KEY" type="string" />
</class>
</hibernate-mapping>

和这个java-code-sniplet:

DetachedCriteria crit = DetachedCriteria.forClass(zBean.class)
    .add(Restrictions.eq("key", "key3"));
List<ListViewDataBean> result = hibernateTemplate.findByCriteria(crit);

该代码生成一些不同的SQL:

select * from tablea a left outer join tableb b on (a.id = b.id) where b.key='key3'

1 个答案:

答案 0 :(得分:0)

如果将'tableB'映射为'zBean'中的OneToMany或OneToOne关联,并使用HQL而不是Criteria查询,则可以使用'with'子句:

select z from zBean z left join z.tableB b with b.key = 'key3'

Hibernate将按预期生成'on'子句。