我可以对未映射到表的实体使用休眠查询语言吗?
Posted
技术标签:
【中文标题】我可以对未映射到表的实体使用休眠查询语言吗?【英文标题】:Can I use hibernate query language for entities not mapped to a table? 【发布时间】:2012-04-04 15:42:33 【问题描述】:以下是我用来检索 HolidayPackages for a given Hotel
的 mysql 查询:
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());
【讨论】:
以上是关于我可以对未映射到表的实体使用休眠查询语言吗?的主要内容,如果未能解决你的问题,请参考以下文章