Java SQL Подготовленный оператор с * ЛЮБЫМИ * критериями - PullRequest
0 голосов
/ 18 февраля 2012

Meet ps, простое PreparedStatement, которое выполняет свою работу:

PreparedStatement ps = cnx.prepareStatement( "SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?");

Мне нужно добавить 3 необязательных критерия (C1, C2, C3). Для ясности, они могут потребоваться, если не основаны на параметрах времени выполнения.
Грубая сила говорит мне, что я могу написать 9 подготовленных операторов, чтобы покрыть все возможности. Но то, что я действительно хотел бы написать, это что-то вроде:

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? AND C1=? AND C2=? AND C3=?;

и используйте трюк типа setInt (5, " ANY ") или ignoreParameter (5) перед выполнением оператора
Есть ли такая вещь?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Нет, нет. Вам нужно будет составить ваш запрос динамически.

Нет необходимости создавать все комбинации. Просто добавьте дополнительный "and c1 = ?" к запросу, если параметр определен, ОК

Есть API, которые делают это для вас. См. Например, http://www.jooq.org/.

1 голос
/ 18 февраля 2012

У вас есть возможность использовать фреймворк, сделать это самостоятельно или выполнить некоторые трюки SQL. Например. JPA имеет CriteriaBuilder .

В противном случае разделите ваш запрос на статическую и динамическую части. В зависимости от вашей динамической части вам придется делать привязку. Вы бы

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?

в качестве статической части и добавляйте AND C1 = ? только при необходимости.

Для параметров SQL вы можете добавить еще 3 параметра и установить для них 0 или 1.

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? 
AND (CHECKC1 = ? OR C1=?) AND (CHECKC2 = ? OR C2=?) AND (CHECKC3 = ? OR C3=?);

Однако я бы не назвал это хорошим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...