2012-03-20 9 views
6

siguiente es la consulta MySQL que estoy usando para recuperar HolidayPackages for a given Hotel:¿Puedo usar el lenguaje de consulta de hibernación para entidades no mapeadas en una tabla?

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; 

tengo POJOs con mapeo para:

  • HolidayPackage
  • hotel
  • HotelRoom

No tengo un POJO para HolidayPackageHotel.

¿Hay alguna manera de utilizar Criteria API o HQL para ejecutar la consulta sql sin crear un POJO para HolidayPackageHotel?

Para los curiosos, las relaciones DB: DB relations

Respuesta

2

No. No se pueden utilizar las entidades de la ONU-mapeados dentro del HQL.

Si desea generar la lista de beans de la consulta, puede usar los transformadores ResultSet , que pueden convertir los resultados de la consulta (matrices de objetos) en beans. Al hacer esto, ahorrará la sobrecarga de crear y llenar los granos de POJO.

Lea here para ver un ejemplo.

+0

que utilizó la siguiente NamedNativeQuery: @NamedNativeQuery ( \t \t name = "getHolidayPackageForHotel", \t \t consulta = "SELECT * FROM wah_schema.holidaypackage PKG INNER JOIN HPH wah_schema.holidaypackagehotel EN pkg.idHolidayPackage = HPH. idHolidayPackage INNER JOIN hr wah_schema.hotelroom eN DONDE hr.idHotelRoom = hph.idHotelRoom hr.idHotel =: idHotel", \t \t clase de resultado = HolidayPackage.class) Esto parecía funcionar para mí, ya que el tipo de retorno: HolidayPackage.class es una entidad POJO que he definido. ¿Crees que este enfoque tiene algún inconveniente? – brainydexter

+0

En cualquier consulta, ** SELECCIONAR * de ** no es un enfoque preferido. Agregue los nombres de columna en la cláusula de selección si es posible. el resto está bien. – ManuPK

+0

me sale una columna ** 'IDHOTELROOM' no encontrado ** si uso esto: SELECT DISTINCT pkg.idHolidayPackage, pkg.name, pkg.itineraryHeader DE wah_schema.holidaypackage PKG combinación interna wah_schema.holidaypackagehotel HPH para la pkg.idHolidayPackage = hph.idHolidayPackage INNER JOIN wah_schema.hotelroom hr ON hr.idHotelRoom = hph.idHotelRoom WHERE hr.idHotel =? – brainydexter

-3

sí, puede utilizar las entidades no mapeadas dentro de la HQL. A continuación se muestra el ejemplo de lo que hice en uno de mis proyectos.

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()); 
} 
Cuestiones relacionadas