Hibernate SQLQuery:包含多个实体和别名列名的数据库视图

时间:2017-06-09 13:04:33

标签: java hibernate

我尝试使用数据库视图一次选择多个类。两个表都有类似的列,如“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映射别名的方法? 不幸的是,这些表有更多的列,所以我试图避免为数据库结果的每一列添加标量。

期待您的提示和建议。

1 个答案:

答案 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);

我希望这可以帮助那些面临同样问题的人。