چگونه SELECT * FROM t WHERE id = را بیان کنیم؟ یا (نام = ? و سن = ?) توسط فقط اشیاء؟

برای پاسخ به این سوال، ابتدا باید مفهوم جدیدی را درک کنیم: عبارت WHERE مسطح نیست بلکه سلسله مراتبی است. در این ساختار، شرایط پرس و جو متصل شده توسط AND یک سطح را تشکیل می دهند، و شرایط پرس و جو متصل شده توسط OR سطح دیگری را تشکیل می دهند. رابط منطقی برای هر لایه یا AND یا OR است. به طور معمول، چند شرط پرس و جو با استفاده از AND متصل می شوند که به طور پیش فرض اولین سطح در نظر گرفته می شود. بنابراین، در عبارت query ذکر شده در عنوان، دو شرط متصل شده توسط OR در سطح دوم و دو شرط داخل شرط دوم OR متصل شده توسط AND در سطح سوم قرار دارند.
استفاده از JSON برای نشان دادن این ساختار سلسله مراتبی ممکن است آن را واضح تر کند:
{
"userOr": {
"id": 5,
"userAnd": {
"name": "John",
"age": 30
}
}
}
هنگامی که این ساختار JSON را به یک عبارت WHERE تبدیل میکنیم، میتوانیم رابطهای منطقی بین شرایط پرس و جوی چندگانه را بر اساس پسوندهای And/Or در نام کلیدها تعیین کنیم. از آنجایی که فقط یک کلید وجود دارد، userOr
، در سطح اول، اتصال AND را می توان حذف کرد. شرایط متعدد تحت userOr
با استفاده از OR متصل می شوند. کلید اول با شرایط مطابقت دارد id = 5
، در حالی که شرایط چندگانه کلید دوم، name = "John"
و age = 30
، مطابق پسوند با AND متصل می شوند And
. سپس این شرایط در داخل پرانتز قرار می گیرند و با آنها ترکیب می شوند id = 5
با استفاده از OR، منجر به عبارت پرس و جو مربوطه می شود: id = 5 OR (name = "John" AND age = 30)
. هنگام ساخت شرایط پرس و جو، پارامترها را می توان با متغیرهایی جایگزین کرد.
در مرحله بعد، بیایید سعی کنیم چنین شی JSON را با استفاده از جاوا بسازیم:
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserQuery {
private Integer id;
private String name;
private Integer age;
private UserQuery userOr;
private UserQuery userAnd;
public static void main(String[] args) throws Exception {
UserQuery userAnd = UserQuery.builder().name("John").age(30).build();
UserQuery userOr = UserQuery.builder().id(5).userAnd(userAnd).build();
UserQuery userQuery = UserQuery.builder().userOr(userOr).build();
ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(objectMapper.writeValueAsString(userQuery));
// Output: {"userOr":{"id":5,"userAnd":{"name":"John","age":30}}}
}
}
اگرچه این رویکرد ممکن است کمی دست و پا گیر باشد، اما به ما امکان می دهد همان شی JSON را بسازیم، به این معنی که می توانیم همان عبارت query را ایجاد کنیم. علاوه بر این، از آنجایی که این شرط پرس و جو را می توان در قالب JSON نشان داد، به این معنی است که هر زبان برنامه نویسی که از JSON پشتیبانی می کند می تواند برای ساخت چنین شرایط پرس و جو استفاده شود. قدم بعدی تلاش برای پیاده سازی این راه حل در زبان های برنامه نویسی مختلف است.