2012-03-20 73 views
6

以下是MySQL查詢我使用檢索HolidayPackages for a given Hotel我可以將hibernate查詢語言用於未映射到表的實體嗎?

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爲:

  • HolidayPackage
  • 酒店
  • 的空房

我沒有的POJO 10。

有沒有什麼辦法可以使用Criteria API或HQL來執行SQL查詢而不需要爲HolidayPackageHotel創建一個POJO?

對於古玩,DB關係: DB relations

回答

2

您不能使用HQL內未映射實體。

如果要從查詢中生成Bean列表,可以使用ResultSet變換器,它可以將查詢結果(對象數組)轉換爲bean。通過這樣做,您將節省創建和填充POJO bean的開銷。

here爲例。

+0

我用下面NamedNativeQuery:@NamedNativeQuery( \t \t名稱= 「getHolidayPackageForHotel」, \t \t查詢=「SELECT * FROM wah_schema.holidaypackage PKG INNER JOIN wah_schema.holidaypackagehotel HPH ON pkg.idHolidayPackage = HPH。 idHolidayPackage INNER JOIN wah_schema.hotelroom小時ON hr.idHotelRoom = hph.idHotelRoom WHERE hr.idHotel =:idHotel」, \t \t resultClass = HolidayPackage.class) 這似乎爲我工作,因爲返回類型:HolidayPackage.class是我定義的POJO實體。你認爲這種方法有什麼缺點嗎? – brainydexter 2012-03-20 09:05:13

+0

在任何查詢中,** SELECT * from **不是首選方法。如果可能,請在select子句中添加列名。其餘的都很好。 – ManuPK 2012-03-20 09:41:01

+0

我收到**列'IDHOTELROOM'找不到**如果我使用這個: 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 =? – brainydexter 2012-03-20 10:08:25

-3

是的,你可以使用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()); 
} 
相關問題