2008-09-16 34 views

Trả lời

6

Bạn đang sau một truy vấn SQL bản địa.

Nếu bạn đang sử dụng JPA cú pháp là:

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

Nếu bạn cần phải trả lại nhiều loại, hãy nhìn vào các SQLResultSetMapping chú thích.

Nếu bạn đang sử dụng API Hibernate trực tiếp:

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); 

Xem 10.4.4. Queries in native SQL trong tài liệu Hibernate để biết thêm chi tiết.

Trong cả hai API, bạn có thể chuyển các tham số như bình thường bằng cách sử dụng setParameter.

+2

Cảm ơn, nhưng đây có phải là điều có thể thực hiện trực tiếp trong Hibernate không? – ncgz

4

Một cách tiếp cận khác là sử dụng ánh xạ. Hãy xem bài viết này: https://forums.hibernate.org/viewtopic.php?f=1&t=998482

Tôi chống lại việc sử dụng các truy vấn SQL tự nhiên trong Hibernate ... bạn bị mất những lợi ích của việc có một ánh xạ :-)

2

Có bạn có thể, nhưng bạn sẽ cần phải mở rộng phương ngữ ngủ đông như sau:

nhập org.hibernate.dialect.Oracle10gDialect;

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

Khi lớp này nằm trên đường dẫn lớp của bạn, bạn sẽ cần phải kể ngủ đông để sử dụng nó thay vì phương ngữ gốc (trong trường hợp này là Oracle10gDialect). Tôi không chắc chắn mà khuôn khổ bạn đang sử dụng, nhưng trong trường hợp của mùa xuân, bạn có thể sử dụng các tài sản sau đây dưới LocalContainerEntityManagerFactoryBean:

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

Sau đó, bạn có thể sử dụng hơn và phân vùng trong chú thích @Formula, chú thích @Where và các tính năng ngủ đông khác mà không gây nhầm lẫn ngủ đông.

Các vấn đề liên quan