Tôi cần phải tạo truy vấn SELECT JOOQ động dựa trên tập hợp các tham số. Tôi không biết làm thế nào để nối nó một cách năng động. Vui lòng giúpTạo truy vấn JOOQ động
Xin cảm ơn trước.
Tôi cần phải tạo truy vấn SELECT JOOQ động dựa trên tập hợp các tham số. Tôi không biết làm thế nào để nối nó một cách năng động. Vui lòng giúpTạo truy vấn JOOQ động
Xin cảm ơn trước.
jOOQ có hai loại API để tạo truy vấn.
API DSL cho phép tạo ra các câu lệnh SQL inline trong mã Java của bạn, ví dụ
create.select(T.A, T.B).from(T).where(T.X.eq(3).and(T.Y.eq(5)));
API "mô hình" cho phép xây dựng SQL gia tăng. Bất cứ lúc nào, bạn có thể truy cập vào "mô hình" API thông qua phương pháp getQuery()
trên một đối tượng truy vấn DSL
Một ví dụ về những gì bạn muốn làm được đưa ra trong cuốn hướng dẫn ở đây:
https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl/
Ví dụ, tùy chọn thêm một tham gia:
DSLContext create = DSL.using(configuration);
SelectQuery query = create.selectQuery();
query.addFrom(AUTHOR);
// Join books only under certain circumstances
if (join)
query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID));
Result<?> result = query.fetch();
Hoặc, optinally thêm điều kiện/vị từ:
012.query.addConditions(BOOK.TITLE.like("%Java%"));
query.addConditions(BOOK.LANGUAGE_CD.eq("en"));
UPDATE: Với ý kiến của bạn, đó là những gì bạn đang tìm kiếm:
// Retrieve search strings from your user input (just an example)
String titleSearchString = userInput.get("TITLE");
String languageSearchString = userInput.get("LANGUAGE");
boolean lookingForTitles = titleSearchString != null;
boolean lookingForLanguages = languageSearchString != null;
// Add only those conditions that the user actually provided:
if (lookingForTitles)
query.addConditions(BOOK.TITLE.like("%" + titleSearchString + "%"));
else if (lookingForLanguages)
query.addConditions(BOOK.LANGUAGE_CD.eq(languageSearchString));
Lưu ý, bạn cũng có thể sử dụng Field.compare(Comparator, Object)
phương pháp:
// Initialise your dynamic arguments
Field<String> field = BOOK.TITLE;
Comparator comparator = Comparator.LIKE;
String value = "%" + titleSearchString + "%";
// Pass them to the field.compare() method
query.addConditions(field.compare(comparator, value));
Mọi chi tiết, xem xét số org.jooq.SelectQuery Javadoc
Nhưng tôi có thêm một câu hỏi nữa. Tôi có thể sử dụng các biến java trong truy vấn (cụ thể trong phần addConditions), để tôi có thể đặt giá trị của các biến đó vào lúc chạy. cho ví dụ. tên cột dọc. – user1900723
@ user1900723: Điều gì giúp bạn không chỉ định các yếu tố đó cho các biến trong Java? –
Hãy để tôi giải thích cho bạn về tình huống. Trên thực tế tôi có một số cột mà tôi phải tìm kiếm trong bảng. Ví dụ: Tên, ID, Ngày tháng. và tôi cần phải lấy dữ liệu theo họ, có một paramater khác có chứa các giá trị như EQUAL TO, BEGINS WITH (cần sử dụng như toán tử), ENDS WITH (cần sử dụng như toán tử). Tôi cần phải làm tất cả điều này một cách năng động. Vì vậy, cần phải sử dụng biến để tôi có thể đặt giá trị trên bay. Vui lòng cho tôi biết nếu bạn cần làm rõ thêm. Tôi bị kẹt ở đây. – user1900723
Bạn có thể rõ ràng hơn một chút không? Ví dụ. bạn có thể cung cấp một truy vấn mẫu mà bạn muốn xây dựng không? Bạn đã thử cái gì, bạn đã thất bại ở đâu? –
Thực ra tôi cần tạo truy vấn chọn; trong đó tôi cần cập nhật mệnh đề where dựa trên các tham số được truyền. Giống như từ giao diện người dùng, tôi đang chuyển một số bộ lọc và muốn thêm vào điều kiện WHERE của mình theo cách động. – user1900723