2008-09-16 22 views

Respuesta

6

Usted está después de una consulta SQL nativo.

Si está utilizando JPA la sintaxis es:

Query q = em.createNativeQuery("select foo.* from Foo foo " + 
           "where f.x = max(f.x) over " + 
           "(partition by f.y)", Foo.class); 

Si necesita devolver varios tipos, echar un vistazo a la SQLResultSetMapping anotación.

Si está utilizando la API de Hibernate directamente:

Query q = session.createSQLQuery("select {foo.*} from Foo foo " + 
           "where f.x = max(f.x) over "+ 
           "(partition by f.y)"); 
q.addEntity("foo", Foo.class); 

Ver 10.4.4. Queries in native SQL en la documentación de Hibernate para más detalles.

En ambas API puede pasar los parámetros de forma normal usando setParameter.

+2

Gracias, pero, ¿es esto algo que se puede hacer directamente en Hibernate? – ncgz

2

Sí se puede, pero se necesita para extender el hibernar el dialecto como el siguiente:

import org.hibernate.dialect.Oracle10gDialect;

public class ExtendedDialect extends Oracle10gDialect{ 
    public ExtendedDialect() 
    { 
      super(); 
      registerKeyword("over"); 
      registerKeyword("partition"); 
    } 
} 

Una vez que esta clase está en la ruta de clases, tendrá que decirle a hibernar a usarlo en vez del dialecto original (en este caso Oracle10gDialect). No estoy seguro de qué marcos que está utilizando, pero en el caso de la primavera, puede utilizar la siguiente propiedad bajo el LocalContainerEntityManagerFactoryBean:

 <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="databasePlatform" value="path.to.dialect.ExtendedDialect" /> 
      </bean> 
     </property> 

continuación, puede utilizar una y otra partición en anotaciones @Formula, anotaciones y @Where otras características de hibernación sin confundir hibernación.

Cuestiones relacionadas