我可以对未映射到表的实体使用休眠查询语言吗?

Posted

技术标签:

【中文标题】我可以对未映射到表的实体使用休眠查询语言吗?【英文标题】:Can I use hibernate query language for entities not mapped to a table? 【发布时间】:2012-04-04 15:42:33 【问题描述】:

以下是我用来检索 HolidayPackages for a given Hotelmysql 查询:

SELECT 
    pkg.idHolidayPackage, pkg.name
FROM
    holidaypackage pkg
        INNER JOIN
    holidaypackagehotel hph ON pkg.idHolidayPackage = hph.idHolidayPackage
        INNER JOIN
    hotelroom hr ON hr.idHotelRoom = hph.idHotelRoom
WHERE
    hr.idHotel = 1;

我有带有以下映射的 POJO:

假日套餐 酒店 酒店客房

我没有HolidayPackageHotel 的 POJO。

有没有什么方法可以使用 Criteria API 或 HQL 来执行 sql 查询,而无需为 HolidayPackageHotel 创建 POJO?

对于古玩,数据库关系:

【问题讨论】:

【参考方案1】:

没有。 您不能在 HQL 中使用未映射的实体

如果您想从查询中生成 bean 列表,您可以使用 ResultSet 转换器,它可以将查询结果(对象数组)转换为 bean。通过这样做,您将节省创建和填充 POJO bean 的开销。

阅读here 了解示例。

【讨论】:

我使用了以下 NamedNativeQuery:@NamedNativeQuery( name = "getHolidayPackageForHotel", query = "SELECT * FROM wah_schema.holidaypackage pkg INNER JOIN wah_schema.holidaypackagehotel hph ON pkg.idHolidayPackage = hph.idHolidayPackage INNER JOIN wah_schema .hotelroom hr ON hr.idHotelRoom = hph.idHotelRoom WHERE hr.idHotel = :idHotel", resultClass= HolidayPackage.class) 这似乎对我有用,因为返回类型:HolidayPackage.class 是我定义的 POJO 实体。您认为这种方法有什么缺点吗? 在任何查询中,SELECT * from 都不是首选方法。如果可能,请在 select 子句中添加列名。其余的都很好。 如果我使用这个,我得到一个 Column 'IDHOTELROOM' not found:SELECT DISTINCT pkg.idHolidayPackage, pkg.name, pkg.itineraryHeader FROM wah_schema.holidaypackage pkg INNER JOIN wah_schema .holidaypackagehotel hph ON pkg.idHolidayPackage = hph.idHolidayPackage INNER JOIN wah_schema.hotelroom hr ON hr.idHotelRoom = hph.idHotelRoom WHERE hr.idHotel = ? 如果您遇到了 NamedNativeQuery 的问题,您可以尝试给出here 的示例。【参考方案2】:

是的,您可以在 HQL 中使用未映射的实体。以下是我在一个项目中所做的示例。

List list = session.createQuery("select p, a from UserAccount p, Channels a " +  "where p.uid = a.uid").list();  

Iterator iter = list.iterator();  
while (iter.hasNext())  
  
  Object[] objArray = (Object[]) iter.next();  
  UserAccount p = (UserAccount) objArray[0];  
  Channels a = (Channels) objArray[1];  
  System.out.println(p.getUsername());  
  System.out.println(a.getTitle());  

【讨论】:

以上是关于我可以对未映射到表的实体使用休眠查询语言吗?的主要内容,如果未能解决你的问题,请参考以下文章

休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系

休眠条件:在没有映射关联的情况下加入表

在 NHibernate 中查询未映射的列

如何将休眠查询的结果映射到 DTO 对象?

使用公式休眠@OneToOne - 列不能外连接到子查询

尽管表上存在行,但休眠查询不返回任何内容