Создание динамического запроса с использованием SqlBuilder в Java - PullRequest
0 голосов
/ 22 мая 2018

Можете ли вы помочь мне создать SQL-запрос, в котором условие

SELECT * FROM classicmodels.offices t1 INNER JOIN classicmodels.employees t0 
  ON (t1.officeCode = t0.officeCode) INNER JOIN classicmodels.customers t2 ON 
  ( (t0.employeeNumber = t2.salesRepEmployeeNumber) OR (t0.firstName = 
  t2.contactFirstName) ) WHERE (t2.creditLimit > 70000) AND (t2.creditLimit < 
  100000) OR (t0.officeCode = 6)
ORDER BY
t0.firstName ASC

Я не могу создать, скажите, пожалуйста, как создать И или ИЛИ оба условия в одном запросе

WHERE (t2.creditLimit > 70000) AND (t2.creditLimit < 100000) OR (t0.officeCode = 6)

Как создать динамический запрос может более одного раза И условие или может быть более одного раза ИЛИ условие.это состояние приходит случайно.тогда я хочу создать запрос.Вы можете помочь мне ....

1 Ответ

0 голосов
/ 22 ноября 2018

Я не уверен, является ли SqlBuilder определенной библиотекой, потому что есть несколько библиотек, которые имеют класс SqlBuilder (например, MyBatis ), и есть другие библиотеки, которые являются построители SQL (например, jOOQ ).Итак, я просто собираюсь ответить на этот вопрос для jOOQ (я работаю на поставщика).

Использование jOOQ

Ваш запрос может быть написан таким образом, если вы используете генератор кода:

// Aliasing is not necessary in your case, but here it is, still:
Offices t1 = OFFICES.as("t1");
Employees t0 = EMPLOYEES.as("t0");
Customers t2 = CUSTOMERS.as("t2");

Result<?> result =
ctx.select()
   .from(t1)
   .join(t0).on(t1.OFFICECODE.eq(t0.OFFICECODE))
   .join(t2).on(t0.EMPLOYEENUMBER.eq(t2.SALESREPEMPLOYEENUMBER)
            .or(t0.FIRSTNAME.eq(t2.CONTACTFIRSTNAME)))
   .where(t2.CREDITLIMIT.gt(70000))
   .and(t2.CREDITLIMIT.lt(100000))
   .or(t0.OFFICECODE.eq(6))
   .orderBy(t0.FIRSTNAME)
   .fetch();

Использование какого-либо другого конкретного SqlBuilder

Если ваш определенный SqlBuilder не может обработать тип написанного вами предиката, возможно, вы можете переписать его таким образом:

WHERE (t2.creditLimit BETWEEN 70001 AND 99999) OR (t0.officeCode = 6)
...