小编典典

如何用源代码编写hbm.xml文件中的此SQL查询?

sql

我正在尝试在Hibernate中运行SQL查询。我正在使用其文档。由于某些未知值,我试图在源代码中执行此操作。

请参阅下面的SQL-Query配置。如何用源代码本身重写它!我试过了

personList = session.createSQLQuery("SELECT person.NAME, person.AGE, person.SEX, address.STREET, address.CITY, address.STATE, address.ZIP FROM person JOIN address WHERE person.ID = address.PERSON_ID").addEntity(Person.class).addEntity(Address.class).list();

我想对上述查询执行的操作是,它应该映射person.ID和PERSON_ID。如果匹配,则使用PERSON表列[NAME,AGE,SEX]获取ADDRESS
[STREET,CITY,STATE,ZIP]表中的其他列。

在JDBC中,结果集的列对于上述查询看起来像

NAME, AGE, SEX, STREET, CITY, STATE, ZIP

但它不能正常工作,它表示未找到查询中的地址列。我的查询版本中是否有语法错误!

映射文件中的查询声明 ;

<sql-query name="personsWith">
<return alias="person" class="eg.Person"/>
<return-join alias="address" property="person.mailingAddress"/>
SELECT person.NAME AS {person.name},
       person.AGE AS {person.age},
       person.SEX AS {person.sex},
       address.STREET AS {address.street},
       address.CITY AS {address.city},
       address.STATE AS {address.state},
       address.ZIP AS {address.zip}
FROM PERSON person
JOIN ADDRESS address
    ON person.ID = address.PERSON_ID
</sql-query>

谢谢


阅读 182

收藏
2021-05-16

共1个答案

小编典典

找不到address列的两个可能原因:

首先,在SQL中,您必须编写表的名称,而不是实体名称。

其次,您的JOIN语句在SQL上可能无效。有几种方法可以实现联接。我将采用直接方法(从两个表中进行选择,并在where子句中说明联接)。

假设该person实体映射了一个名为“ TABLE_PERSON”的表,并address映射了“
TABLE_ADDRESS”表,则有效查询如下所示:

SELECT person.NAME, person.AGE, person.SEX, 
     address.STREET, address.CITY, address.STATE, address.ZIP 
FROM TABLE_PERSON person, TABLE_ADDRESS address 
WHERE person.ID = address.PERSON_ID

还有一点。查看休眠文档,我发现了以下示例:

List cats = sess.createSQLQuery("select {cat.*}, {kitten.*} from cats cat, cats kitten 
where kitten.mother = cat.id").
     setResultSetMapping("catAndKitten").list();

因此,问题可能不在于查询本身,而在于您正在使用的resultSet映射以及引用字段的方式。

让我们假设这个映射(来自Hibernate文档):

<resultset name="personAddress">
    <return alias="person" class="eg.Person"/>
    <return-join alias="address" property="person.mailingAddress"/>
</resultset>

然后,例如,您的查询应定义大括号({})之间的列,并使用您在映射处定义的别名:

personList = session.createSQLQuery(
             "SELECT {person.NAME}, {person.AGE}, {person.SEX}, "+
            "{address.STREET}, {address.CITY}, {address.STATE}, {address.ZIP} "+
            "FROM TABLE_PERSON person, TABLE_ADDRESS address "
            "WHERE person.ID = address.PERSON_ID"
        ).setResultSetMapping("personAddress")
         .list();

请告诉我这个例子是否可行。

2021-05-16