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

时间:2010-09-24 06:36:03

标签: sql hibernate hql

我正在尝试在Hibernate中运行SQL查询。我正在使用documentation。 由于我想在源代码中尝试做一些未知的值。

请参阅下面的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>

由于

2 个答案:

答案 0 :(得分:2)

找不到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

还有一点。检查hibernate文档,我找到了这个例子:

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

所以,问题可能不在于查询本身,而在于你正在使用的resultSet Mapping以及引用这些字段的方式。

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

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

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

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();

请告诉我这些例子是否有效。

答案 1 :(得分:2)

由于您滥用AddEntity

,它无效

这段代码:

personList = session
  .createSQLQuery("SELECT ...")
  .addEntity(Person.class)
  .addEntity(Address.class).list();

addEntity确实为查询添加了一个实体类型的参数。例如,你可以这样做:

personList = session
  .createSQLQuery("from person where address = :address"
  .addEntity("address", myAddess);

我不确定你是否可以在代码中执行相同的实体映射。我不得不阅读文档。


修改

您可以轻松找到所有具有以下地址的人:

session.createQuery("from Person p where p.address is not null");

或者,如果人身上没有adress财产:

session.createQuery("select distinct a.Person from Address");

假设你可以在同一地址上有几个人。