2008-09-16 16 views

Antwort

6

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.

+2

Danke, aber ist das etwas, was direkt in Hibernate getan werden kann? – ncgz

2

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.

Verwandte Themen