JPQL一对多查询

时间:2014-05-27 12:47:21

标签: java sql hibernate jpa

实体A具有类型B的一些实体的集合。类型B不知道(并且不应该)类型A是什么。我想查询A,其中至少有一个B具有某些属性。

对于映射,我在A映射端使用简单的一对多和一个连接列。

然而,当我使用JPQL执行此操作时,我无法真正使用JPA生成的列a_id,因为它不是B的字段 - 因此导致PropetyNotFound - jpa异常。有没有一种方法可以使用该列而不必在实体本身中定义属性?

实体映射:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
        http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">

    <package>com.example</package>

    <entity class="B" access="FIELD">
        <attributes>
            <id name="seqid">
                <generated-value strategy="AUTO" />
            </id>
            <basic name="identifier" />
            <basic name="payload" />
            <version name="version" />
        </attributes>
    </entity>

    <entity class="A" access="FIELD">
        <attributes>
            <id name="seqid">
                <generated-value strategy="AUTO" />
            </id>
            <one-to-many name="bset">
                <join-column name="a_id"
                    referenced-column-name="seqid" />
                <cascade>
                    <cascade-all />
                </cascade>
            </one-to-many>
        </attributes>
    </entity>

</entity-mappings>

谢谢!

1 个答案:

答案 0 :(得分:0)

确保你在集合上使用join子句。如果没有它,将构造没有错误的查询,但这将在执行时因奇怪的错误而失败。所以正确的查询看起来像

select a from A a join a.setB b where b in (select c from B where B.x = 'x');

这会成功,但

select a from A a where a.setB in (select c from B where B.x = 'x');

将失败,没有明显的理由。