2016-03-11 3 views
1

Я хочу, чтобы связать несколько параметров с этим запросом динамически,Свяжите несколько параметров с Hibernate Query

Query selectList = session.createSQLQuery("select * from Txn where recNo =: recNo") 
.addEntity(Txn.class); 

selectist.setParameter("recNo",recNo);  
selectTxnList.setFirstResult(startRowNo);   
selectTxnList.setMaxResults(scrollValue); 

List list = selectTxnList.list(); 

Предположим, здесь я проверить, что если я не нуль в txnNo тогда я хочу, чтобы связать этот параметр также с этим запросом

Пример - выберите * из Txn, где recNo = 123 и txnNo = txnNo;

, и если у меня есть null в txnNo, тогда я хочу связывать recNo с этим запросом.

Пример - выберите * из Txn, где recNo = 123;

Пожалуйста, расскажите мне, как я могу это сделать с помощью HQL, потому что у меня более 50 параметров. я не хочу, чтобы увеличить параметр запроса (выберите * из Txn где Recno =: Recno )

+1

Неправильно ли с использованием инструкции 'if' в вашей логике Java справиться с этим? –

+0

Нет ничего плохого в этом, но что бы мы сделали с запросом (выберите * из Txn, где recNo =: recNo), как я могу увеличить параметр здесь? нет проблем, если он может быть преобразован в запрос HQL. но как я могу это сделать –

ответ

1

Вот один вариант вы бы для обработки этой логики внутри самого запроса:

String query = "select * from Txn where recNo = :recNo and "; 
     query += "(case when :txnNo is not null then txnNo = :txnNo else true end)"; 

Этот обеспечит равенство по txnNo только в том случае, если оно не будет NULL, в противном случае этот параметр будет проигнорирован.

Но я бы предпочел обработать вашу ситуацию, используя оператор if в логике Java, а не используя этот запрос.

Update:

Другим вариантом было бы использовать следующую идиому для каждого из 50 столбцов:

where (col = :col or col is null) 

Это условие сработает верно, когда col является неNULL и соответствует запись, и он также будет срабатывать, когда col - NULL (в этом случае для большинства СУБД значение равенства должно быть NULL).

В общем случае, если вы хотите, чтобы целые части предложения WHERE условно присутствовали в запросе, для этого вам нужен динамический SQL. В контексте Java и Hibernate это означает формирование строки запроса в вашем прикладном уровне.

+0

да это не будет эффективным, потому что у меня более 50 параметров в моем запросе. пожалуйста, скажите мне, как я могу справиться с этой ситуацией, используя HQL –

+0

@LokeshRathor Я обновил свой ответ, пожалуйста, посмотрите. –

Смежные вопросы