Gibt es eine Möglichkeit, sql-server-ähnliche analytische Funktionen in Hibernate zu verwenden?Ist es möglich, analytische Funktionen in Hibernate zu verwenden?
So etwas wie
select foo from Foo foo where f.x = max(f.x) over (partition by f.y)
Gibt es eine Möglichkeit, sql-server-ähnliche analytische Funktionen in Hibernate zu verwenden?Ist es möglich, analytische Funktionen in Hibernate zu verwenden?
So etwas wie
select foo from Foo foo where f.x = max(f.x) over (partition by f.y)
Sie sind nach einer nativen SQL-Abfrage.
Wenn Sie JPA verwenden die Syntax ist:
Query q = em.createNativeQuery("select foo.* from Foo foo " +
"where f.x = max(f.x) over " +
"(partition by f.y)", Foo.class);
Wenn Sie mehrere Arten zurückgeben müssen, werfen Sie einen Blick auf die SQLResultSetMapping Anmerkung.
Wenn Sie den Hibernate-API direkt verwenden:
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);
10.4.4. Queries in native SQL in der Hibernate-Dokumentation für weitere Details.
In beiden APIs können Sie Parameter wie gewohnt mit setParameter übergeben.
Danke, aber ist das etwas, was direkt in Hibernate getan werden kann? – ncgz
Ein anderer Ansatz wäre die Verwendung des Mappings. finden Sie in diesem Artikel: https://forums.hibernate.org/viewtopic.php?f=1&t=998482
Ich bin gegen die Verwendung von nativen SQL-Abfragen in Hibernate ... verlieren Sie die Vorteile, die eine Zuordnung :-)
Ja können Sie, aber Sie müssen erweitern die Hibernate Dialekt wie folgt:
importieren org.hibernate.dialect.Oracle10gDialect;
public class ExtendedDialect extends Oracle10gDialect{
public ExtendedDialect()
{
super();
registerKeyword("over");
registerKeyword("partition");
}
}
Sobald diese Klasse auf Ihrem Classpath ist, müssen Sie es sagen, überwintern anstelle des ursprünglichen Dialekt zu verwenden (in diesem Fall Oracle10gDialect). Ich bin nicht sicher, welche Frameworks Sie verwenden, aber im Fall des Frühlings, können Sie die folgende Eigenschaft unter dem LocalContainerEntityManagerFactoryBean verwenden:
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="path.to.dialect.ExtendedDialect" />
</bean>
</property>
Dann können Sie über und Partition in @Formula Anmerkungen, @Where Annotationen verwenden und andere Ruhezustandsfunktionen ohne verwirrenden Winterschlaf.
Pedanterie: * analytic – GEOCHET