with type query example createsqlquery addscalar sql hibernate

sql - type - ¿Es posible usar funciones analíticas en Hibernate?



jpa sql (3)

Está buscando una consulta SQL nativa.

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, eche un vistazo a la anotación SQLResultSetMapping .

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. Consultas en SQL nativo en la documentación de Hibernate para más detalles.

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

¿Hay alguna manera de usar funciones analíticas similares a SQL Server en Hibernate?

Algo como

select foo from Foo foo where f.x = max(f.x) over (partition by f.y)



Sí, puedes, pero deberás extender el dialecto Hibernate de la siguiente manera:

import org.hibernate.dialect.Oracle10gDialect;

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

Una vez que esta clase esté en su ruta de clase, deberá indicarle a hibernate que la use en lugar del dialecto original (en este caso, Oracle10gDialect). No estoy seguro de qué marcos está utilizando, pero en el caso de Spring, puede usar la siguiente propiedad en LocalContainerEntityManagerFactoryBean:

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

A continuación, puede usar sobre y partición en anotaciones @Formula, @Where anotaciones y otras características de hibernación sin confundir hibernación.