2013-02-19 18 views
6

Tôi có một số mã mà trông như thế này:Lấy giá trị của selectCount trong jooq

Record record = jooq 
    .selectCount() 
    .from(USERS) 
    .fetchOne(); 

Hiện nay tôi đang làm như sau để lấy số liệu:

Integer count = (Integer) record.getValue(0); 

Nhưng nó có vẻ như có phải là một giải pháp tốt hơn (đó là loại an toàn ... vì đó là toàn bộ điểm sử dụng jooq). Bất kỳ đề xuất?

Trả lời

6

Thật không may, đối với truy vấn cụ thể này, không có nhiều cách "tốt hơn" để nhận được giá trị count(). Những gì bạn có thể làm, để thêm loại an toàn, là thế này:

Field<Integer> f = count(); 
Integer count = jooq. 
    .select(f) // Or selectCount(). Replaced it to illustrate the case 
    .from(USERS) 
    .fetchOne(f); 

Vấn đề là hầu hết các loại thông tin về dự báo đã được "mất" để trình biên dịch Java, bởi thời điểm fetch() phương pháp này "đạt". Không có cách nào mà phương thức ResultQuery.fetchXXX() có thể khôi phục nó từ mệnh đề SELECT và tạo nó cho bạn.

Trên nhóm người dùng jOOQ, một số người dùng đã lập luận để di chuyển phép chiếu sang các phương pháp fetch(), hoàn toàn, cách LINQ của C# hoặc SLICK của Scala làm điều đó. Điều này sẽ làm phức tạp thêm biểu hiện của các câu lệnh nâng cao hơn SELECT. An more elaborate explanation is documented here.

Với jOOQ 3.0, các loại an toàn cấp kỷ lục bổ sung đã được giới thiệu. Trong jOOQ 3.3, nó sẽ do đó có thể lấy một giá trị như vậy (đã được đăng ký là #2246):

<T> T fetchValue(Select<Record1<T>> select);