我尝试使用数据库视图一次选择多个类。两个表都有类似的列,如“ID”。因此视图正在使用别名。 不幸的是,Hibernate没有正确地映射“ID” - 字段。
这是一个简化的例子:
Species Cat
| ID | Name | | ID | Name | SpeciesId
+----+--------------+ +----+--------------+---------
| 1 | Tuxedo cat | | 1 | Sylvester | 1
| 2 | Sylvester Jr | 1
| 3 | Sylth Vester | 1
这些表格可能会产生以下视图
CREATE VIEW 'CatsBySpecies' AS
SELECT
SPECIES.ID,
SPECIES.NAME,
CAT.ID AS CAT_ID,
CAT.NAME AS CAT_NAME
FROM SPECIES
LEFT JOIN CAT ON CAT.SPECIESID = SPECIES.ID;
查询结果是正确的:
|ID| Name | CAT_ID | CAT_NAME |
+--+----------+--------+--------------+
|1 |Tuxedo cat| 1 | Sylvester |
|1 |Tuxedo cat| 2 | Sylvester Jr |
|1 |Tuxedo cat| 3 | Sylth Vester |
到目前为止,非常好。
Hibernate查询:
String select = "Select * from CatsBySpecies";
catQuery = persistentSession.createSQLQuery(select).addEntity(Species.class).addEntity(Cat.class);
Iterator<?> pairs = catQuery.list().iterator();
但是这些类没有正确映射,结果元组看起来像这样
Species: Cat:
ID = 1 ID = 1
Name = Tuxedo cat Name = Tuxedo cat
因此,hibernate似乎识别相应的列名并将它们与对象属性进行比较。
有没有办法告诉hibernate映射别名的方法? 不幸的是,这些表有更多的列,所以我试图避免为数据库结果的每一列添加标量。
期待您的提示和建议。
答案 0 :(得分:1)
通过调整我的选择字符串解决了这个问题。
在这种情况下,使用{}
表单(也提到here)
此外,我不得不宣布别名列名。 新的选择字符串如下所示:
String select = "Select id as {spec.id}, name as {spec.name}, cat_id as {cat.id}, cat_name as {cat.name} from CatsBySpecies";
现在我们可以像往常一样获取对象:
catQuery = persistentSession.createSQLQuery(select).addEntity("spec", Species.class).addEntity("cat", Cat.class);
我希望这可以帮助那些面临同样问题的人。