我正在尝试在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>
谢谢
找不到address列的两个可能原因:
address
首先,在SQL中,您必须编写表的名称,而不是实体名称。
其次,您的JOIN语句在SQL上可能无效。有几种方法可以实现联接。我将采用直接方法(从两个表中进行选择,并在where子句中说明联接)。
假设该person实体映射了一个名为“ TABLE_PERSON”的表,并address映射了“ TABLE_ADDRESS”表,则有效查询如下所示:
person
TABLE_PERSON
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();
请告诉我这个例子是否可行。