我正在尝试在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>
由于
答案 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");
假设你可以在同一地址上有几个人。