2017-06-08 8 views
0

複数の列IN句の場合に、Hibernate SQLクエリにパラメータを設定するにはどうすればよいですか?複数の列を使用してHibernate SQLクエリ

EXについては、SQLクエリは以下のようなとして生成する必要があります。

SELECT * FROM TABLE TA WHERE (TA.COLUMN1 , TA.COLUMN2) IN ((C1v, C2v), (C1v, C2v), .....); 

は、私は、これは here述べたように春jdbcTemplateで達成することができます参照して、しかし、私は、Hibernate SQLクエリでこれをしたいです。

は私がシナリオの下にしようとしたが、それらのどれも私のために動作しません:エラー:すべてのケースで

String sql = "SELECT * FROM TABLE TA WHERE (TA.COLUMN1 , TA.COLUMN2) IN (:ids)"; 
// 1. List of BigDecimal array's 
List<BigDecimal[]> ids = new ArrayList<>(); 
BigDecimal[] bd1 = {new BigDecimal(100119401), new BigDecimal(2)}; 
BigDecimal[] bd2 = {new BigDecimal(100119000), new BigDecimal(1)}; 
ids.add(bd1); 
ids.add(bd2); 

Query query = session.createSQLQuery(sql); 
query.setParameterList("ids", ids); 

// 2. List of Object arrays 
List<Object []> ids = new ArrayList<>(); 
Object [] bd1 = {new BigDecimal(100119401), new BigDecimal(2)}; 
Object [] bd2 = {new BigDecimal(100119000), new BigDecimal(1)}; 
ids.add(bd1); 
ids.add(bd2); 

Query query = session.createSQLQuery(sql); 
query.setParameterList("ids", ids); 

// 3. List of inner lists with ids 
List<BigDecimal> ob1 = new ArrayList<BigDecimal>(); 
ob1.add(new BigDecimal(100119401));ob1.add(new BigDecimal(2)); 
List<BigDecimal> ob2 = new ArrayList<BigDecimal>(); 
ob2.add(new BigDecimal(100119401));ob2.add(new BigDecimal(2)); 
List<List<BigDecimal>> ids = new ArrayList<List<BigDecimal>>(); 
ids.add(ob1);ids.add(ob2); 

Query query = session.createSQLQuery(sql); 
query.setParameterList("ids", ids); 

「無効な関係演算子ORA-00920」を取得しています。そのような何かが動作するはず

Caused by: java.sql.SQLSyntaxErrorException: ORA-00920: invalid relational operator 

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776) 
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502) 
    at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
    at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 
    ... 141 more 
+0

ではありません

例外

.. https://stackoverflow.com/a/26416368/2893693 – Jobin

+0

できる場合はクエリが実行されています1つのタプルだけを設定します。 'BigDecimal [] arr1 = {新しいBigDecimal(100119401)、新しいBigDecimal(2)}; query.setParameterList( "ids"、arr1); '二次元配列を使うべきだと思います。誰も2次元配列をクエリに設定する方法を提案できますか? – user3779369

答えて

0

String sql = "SELECT * FROM TABLE TA WHERE CONCAT(TA.COLUMN1, '|', TA.COLUMN2) IN (:values)"; 
List<String> values = new ArrayList<>(); 
values.add("100119401|2"); 
values.add("100119000|1"); 

// ... 

Query query = session.createSQLQuery(sql); 
query.setParameterList("values", values); 

NB:セパレータを使用してください、ここで|、これは役立つかもしれないあなたのデータ

+0

RCに感謝します。これは、クエリのわずかな変更でうまく動作します。_String sql = "SELECT * FROM TABLE TA CONCAT(CONCAT(TA.COLUMN1、 '|')、TA.COLUMN2)IN(:values)";しかし、このアプローチでは、クエリに多くのパフォーマンス上の影響があります。( – user3779369

+0

答えはあなたにアイデアを提供するものであり、スニペットを使用する準備ができていませんでした;) –

+0

[完全なテーブルスキャンでパフォーマンスの問題が発生する場合]連結された列の関数ベースの索引 –

関連する問題