2010-07-30 27 views
11

Tôi cần danh sách có ba cột. cột 1 và 3 có giá trị trong khi thứ 2 là null. Tôi có thể làm điều đó thông qua truy vấn HQL không?Tôi có thể chọn null làm giá trị cột trong truy vấn HQL không?

tôi cần một cái gì đó như thế này:

select id, null, name from MyClass 

đâu MyClass cũng như bảng bên dưới chỉ có hai thuộc tính/cột tức là, "id" và "tên"

Trả lời

14

Một tùy chọn khác mà dường như để làm việc (thử nghiệm trên DB2, MySQL, Oracle, và SQL Server):

select id, cast(null as char), name from ... 

Bạn có thể phân lớp các phương ngữ Hibernate và trừu tượng nó với một chức năng tùy chỉnh:

registerFunction("always_null", 
    new SQLFunctionTemplate(Hibernate.STRING, "cast(null as char)")); 

và sau đó sử dụng này trong HQL của bạn:

select id, always_null(), name from ... 
+0

Thú vị! Bạn vẫn nhận được một "thực" 'null' với' cast (null là char) 'hoặc bạn nhận được một' 'null''? –

+0

Vâng, đó là một số thực. –

+0

Tuyệt! Trong trường hợp không có giải pháp chung trong hibernate, nó giúp tiết kiệm da của chúng tôi. Điều tốt là, chúng tôi sẽ không phải chơi với các đối tượng Java – WSK

1

AFAIK, truy vấn của bạn sẽ không trả lại kết quả mong đợi, nó sẽ chỉ trả lại các cột trướcnull (id trong trường hợp của bạn). Tuy nhiên, sau đây sẽ làm việc

select id as first, '', name from MyClass 

Tôi không biết nếu điều này là một lỗi hay chỉ là một tổ chức phi hỗ trợ tính năng (các HQL help: possible to "select NULL as ..."? chủ đề trên các diễn đàn Hibernate dường như cho thấy đó là một lỗi).

Tôi không chắc tôi hiểu tại sao bạn cần điều này (biểu thức select new có thể thay thế không?) Nhưng tôi e rằng bạn sẽ phải sử dụng SQL nguyên gốc tại đây.

+0

"chọn đối tượng mới (id, null, tên) từ MyClass" không hoạt động tốt – WSK

+0

@SJP Vâng, tôi biết nhưng đó không phải là ý tôi. Tôi có nghĩa là sử dụng 'mới Foo (id, tên) 'và thiết lập một thuộc tính thứ ba để' null' trong constructor. –

+0

oh, tôi đã bỏ lỡ quan điểm của bạn trong lần thử đầu tiên. Trong những tình huống mà null thực sự quan trọng, chúng ta có thể cản đường nhưng việc sử dụng thường xuyên của nó sẽ làm lộn xộn các lớp thực thể. BTW cho trường hợp hiện tại của bạn đề nghị đầu tiên của bạn làm việc như một say mê. – WSK

1

bạn cũng có thể thử TO_CHAR (null). Nó hoạt động tốt cho HQL-Oracle trong hàm tạo mới Foo (id, name, attr3) trong đó attr3 - Giá trị chuỗi

4

Bạn có thể sử dụng hàm nullif() để tạo null.

Nó chấp nhận hai đối số. Nếu các đối số bằng nhau, nó sẽ trả về giá trị null.

+0

Bạn đã cứu tôi, cảm ơn bạn rất nhiều. IMHO đây là giải pháp sạch nhất. Sử dụng 'NULLIF (1,1)' hoạt động tốt :) –

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