2010-05-08 27 views
8

Tôi có một vấn đề với Hibernate Native Query. Tôi có một SELECT để chọn mảng slice (cơ sở dữ liệu PostgreSQL).Hibernate Native Query vấn đề với các thông số được đặt tên

Vấn đề là ngủ đông nhận ra phần sau: ": 300" từ "SELECT my_array [1: 300] ..." như tham số được đặt tên và tôi nhận được ngoại lệ sau: Không phải tất cả tham số đã đặt đã được đặt.

Tôi đã cố gắng thoát khỏi dấu hai chấm (:) bằng ':', '::' nhưng không thành công.

phiên bản Các Hibernate là 3,2

Trả lời

4

tôi không sử dụng PostgreSQL nhưng nếu bạn không tìm thấy một giải pháp thích hợp cho vấn đề này bạn có thể thực hiện một đánh chặn (mở rộng EmptyInterceptor) và sửa đổi truy vấn của bạn trên onPrepareStatement(String sql).

Điều đó có nghĩa là bạn có thể đang sử dụng một cái gì đó như my_array[1|300] và viết lại nó làm my_array[1:300] để khắc phục sự cố thông số được đặt tên.

Chỉnh sửa: Tôi không chắc chắn 100% các tác phẩm trên (viết lại SQL gốc và liệu trình phân tích cú pháp truy vấn có cho phép ký tự đặc biệt) không. Tôi đã chỉ thực hiện ở trên trong HQL và tiêu chí mà tôi đã đi qua gợi ý chỉ mục như là một bình luận truy vấn.

+0

Cảm ơn, làm việc cũng với Native Queries :) – dime

3

Dấu hai chấm không thể thoát được trong chính Hibernate (được biết Bug từ năm 2005).

1
create function array_slice(a anyarray, start int4, end int4) returns anyarray as 
$$ 
    SELECT a[start:end]; 
$$ 
language(sql); 

Bây giờ, hãy gọi hàm này thay thế. Đã không thử nó nhưng nó sẽ làm việc bằng cách nào đó như thế này.

1

MyInterceptor extends EmptyInterceptor hoạt động như được đề cập bởi cherouvim.

đừng quên

<property name="hibernate.ejb.interceptor" value="MyInterceptor"/> 

trong persistence.xml

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