Trong ORMLiteWhere.or(Where<T, ID> left, Where<T, ID> right, Where<T, ID>... others)
là một chút của một cú pháp hack. Khi bạn gọi:
w.or(
w.gt("x", 1).and().lt("x", 100),
w.gt("x", 250).and().lt("x", 300)
);
gì phương pháp or()
được là:
w.or(w, w);
Bạn thực sự có thể viết lại nó như:
w.gt("x", 1).and().lt("x", 100);
w.gt("x", 250).and().lt("x", 300);
w.or(w, w);
Các or
phương pháp chỉ có đang sử dụng các đối số để đếm có bao nhiêu mệnh đề cần bật ra khỏi ngăn xếp. Khi bạn gọi gt
và lt
và các thiết bị khác, nó sẽ đẩy các mục trên ngăn xếp khoản. Phương pháp and()
kéo 1 mục ra khỏi ngăn xếp và sau đó lấy một mục khác trong tương lai. Chúng tôi làm những hacks cú pháp bởi vì chúng tôi muốn hỗ trợ tuyến tính, xiềng xích, và các truy vấn tham số dựa trên:
w.gt("x", 1);
w.and();
w.lt("x", 100);
so:
w.gt("x", 1).and().lt("x", 100);
so:
w.and(w.gt("x", 1), w.lt("x", 100));
Nhưng điều này có nghĩa là bạn có sức mạnh để đơn giản hóa mã của bạn vô cùng bằng cách sử dụng phương thức Where.or(int many). Vì vậy, trong ví dụ or
trên cũng có thể là:
w.gt("x", 1).and().lt("x", 100);
w.gt("x", 250).and().lt("x", 300);
// create an OR statement from the last 2 clauses on the stack
w.or(2);
Vì vậy, bạn không cần danh sách conditions
ở tất cả. Tất cả những gì bạn cần là một bộ đếm.Vì vậy, bạn có thể làm điều gì đó như:
int clauseC = 0;
for (int i : values) {
if (i == 1) {
w.le(C_PREIS, 1000);
clauseC++;
} else if (i == 2) {
w.gt(C_PREIS, 1000).and().le(C_PREIS, 2500);
clauseC++;
} else if (i == 3) {
w.gt(C_PREIS, 2500).and().le(C_PREIS, 5000);
clauseC++;
} else if (i == 4) {
w.gt(C_PREIS, 5000).and().le(C_PREIS, 10000);
clauseC++;
} else if (i == 5) {
w.gt(C_PREIS, 10000);
clauseC++;
}
}
// create one big OR(...) statement with all of the clauses pushed above
if (clauseC > 1) {
w.or(clauseC);
}
Nếu i
chỉ có thể là 1-5 sau đó bạn chỉ có thể sử dụng values.size()
và bỏ qua clauseC
. Lưu ý rằng nếu chúng ta chỉ thêm một mệnh đề thì chúng ta có thể bỏ qua toàn bộ cuộc gọi phương thức OR
.
Oh, và tuyên bố sau sẽ không công việc:
target.or().raw(first.getStatement());
vì target
và first
là cùng một đối tượng. first.getStatement()
bãi toàn bộ mệnh đề SQL WHERE
mà tôi không nghĩ là những gì bạn muốn.
Điều đó hoạt động tuyệt vời! Cảm ơn thông tin cơ bản về ORMlite và giải thích và trợ giúp. Vui lòng xóa mã và độ phức tạp. Cảm ơn bạn! –
Vui lòng giúp Sebastian. Tôi đã thực sự kinh hoàng rằng @Jon đã thử câu trả lời một câu hỏi ORMLite. Lý do duy nhất tại sao tôi nhận được bất kỳ điểm nào là từ câu hỏi ORMLite. Câu trả lời của anh ta thường rất tuyệt. :-) Hãy chắc chắn chỉnh sửa câu hỏi của bạn và xóa hoặc sửa các phần "Đã giải quyết" đã lỗi thời. – Gray