2009-12-15 16 views
12

Nếu tôi là để xác định một số chức năng trong cơ sở dữ liệu (có lẽ Postgres, hoặc bất kỳ cơ sở dữ liệu khác):Làm thế nào bạn có thể gọi các chức năng cơ sở dữ liệu tùy chỉnh với Hibernate?

create or replace function isValidCookie(ckie); 

tôi sẽ gọi nó là từ SQL như:

select * from cookietable c where isValidCookie(c.cookie); 

Làm thế nào tôi có thể gọi một tùy chỉnh chức năng như thế này từ Hibernate?

+0

Tôi biết bạn có thể sử dụng chế độ xem giống như bảng (chỉ cần sử dụng trong xml), nhưng để gọi hàm sẽ rất tiện dụng – Zoidberg

Trả lời

13

Nếu bạn muốn sử dụng chức năng tùy chỉnh của bạn trong HQL, bạn sẽ cần phải định nghĩa nó trong thích hợp Dialect

Hãy xem PostgreSQLDialect (hoặc bất kỳ khác, thực sự) nguồn, và bạn sẽ thấy một bó trong số các cuộc gọi registerFunction(). Bạn sẽ cần phải thêm một :-) - cho chức năng tùy chỉnh của riêng bạn.

Sau đó, bạn sẽ phải chỉ định phương ngữ của riêng mình trong cấu hình Hibernate.

3

Bạn có thể thực hiện việc đó bằng truy vấn gốc. Điều này doc giải thích.

3

Kể từ Hibernate 5, nếu bạn không muốn phụ thuộc vào hoặc tùy chỉnh phương ngữ, bạn có thể xác định MetadataBuilderInitializer. Ví dụ, để sử dụng MySQL DATE_ADD với một INTERVAL từ HQL, bạn có thể định nghĩa một hàm tùy chỉnh được gọi date_add_interval:

public class DateAddIntervalMetadataBuilderInitializer 
     implements MetadataBuilderInitializer { 
    @Override 
    public void contribute(MetadataBuilder metadataBuilder, 
      StandardServiceRegistry serviceRegistry) { 
     metadataBuilder.applySqlFunction("date_add_interval", 
      new SQLFunctionTemplate(DateType.INSTANCE, 
       "DATE_ADD(?1, INTERVAL ?2 ?3)")); 
    } 
} 

Bạn cũng sẽ cần phải đặt tên của lớp trong một tập tin tài nguyên JAR gọi META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer.

Cách tiếp cận này đặc biệt hữu ích khi sử dụng Hibernate thông qua một khung công tác như JPA và/hoặc Spring, nơi cấu hình được thực hiện hoàn toàn bởi khung công tác.

+0

Hey Tôi cần chính xác tính năng này để hỗ trợ các hàm Mariadb COLUMN_GET và TIMESTAMPDIFF. Hiện nay hibernate cố gắng tiền tố các tham số hàm với bí danh truy vấn. Tôi phải đăng ký các lớp này trong Spring Boot ở đâu? – Pascal

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