2008-09-16 2 views

ответ

6

Вы после нативного запроса SQL.

Если вы используете JPA синтаксис:

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

Если вам нужно возвратить несколько типов, посмотрите на SQLResultSetMapping аннотацию.

Если вы используете в API Hibernate непосредственно:

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 в документации Hibernate для получения более подробной информации.

В обоих API-интерфейсах вы можете передавать параметры, как обычно, с помощью setParameter.

+2

Спасибо, но это что-то, что можно сделать непосредственно в Hibernate? – ncgz 2008-09-17 21:25:31

4

Другим подходом было бы использовать отображение. Пожалуйста, обратитесь к этой статье: https://forums.hibernate.org/viewtopic.php?f=1&t=998482

Я против использования нативных запросов SQL в Hibernate ... вы теряете преимущество наличия картирования :-)

2

Да вы можете, но вам нужно будет продлить диалект спящего режима:

import org.hibernate.dialect.Oracle10gDialect;

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

После того, как этот класс находится на вашем пути к классам, вам нужно будет сказать спящий режим, чтобы использовать его вместо оригинального диалекте (в данном случае Oracle10gDialect). Я не уверен, рамках которой вы используете, но в случае Spring, вы можете использовать следующее свойство под LocalContainerEntityManagerFactoryBean:

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

Затем вы можете использовать над и раздела в @Formula аннотаций, @Where аннотации и другие функции гибернации, не запутывающие спящий режим.

Смежные вопросы