2017-11-22 12 views
0

すべてのSQLクエリをHibernateパラメータを使用するように変換しています。私は私のクエリにパラメータを追加し、それは常に私にエラーを与える変数とそれをマップするとき:今Hibernateが変換データ型例外をスローする

ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Error converting data type nvarchar to bigint.

私は文字列パラメータを追加しましたので、それはどんな意味がありません。

クエリは次のようになります。

Query query = session.createSQLQuery("SELECT Sum([qtyrequired]) as pcs, o.materialrequireddate, itemid " 
       + "FROM [materialManagement].[pcsorderrequirement] r JOIN materialmanagement.pcsorders o " 
       + "ON o.id = r.pcsorderid WHERE itemid IN (:items) " 
       + "AND Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE) " 
       + "AND o.materialrequireddate <= Cast(:endDate AS DATE) " 
       + "GROUP BY o.materialrequireddate, itemid") 
       .setString("items", items).setString("endDate", endDate.format(DateTimeFormatter.ISO_LOCAL_DATE)); 

私は、クエリ働く私の元に戻ったとき、それは次のようになります。私は名前付きパラメータを使用する場合は、この例外を作成することができますどのような

Query query = session.createSQLQuery("SELECT Sum([qtyrequired]) as pcs, o.materialrequireddate, itemid " 
       + "FROM [materialManagement].[pcsorderrequirement] r " + "JOIN materialmanagement.pcsorders o " 
       + "ON o.id = r.pcsorderid " + "WHERE itemid IN (" + items + ") " 
       + "AND Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE) " 
       + "AND o.materialrequireddate <= Cast('" + endDate + "' AS DATE) " 
       + "GROUP BY o.materialrequireddate, itemid"); 

?私はHibernate 5.1を使用していて、データベースのMS SQLサーバー用です。

+0

例外の理由は、あなたがアイテムID値のリストについては、単一の文字列パラメータを渡しているです。 SQL Serverでは、IN句の各値に個別の整数パラメータが必要です。私はHibernateでそれを行う方法に話すことができません。 –

+0

これは1つの例ですが、INに配置されない通常の文字列値をインクルードするときも、すべてのマッピングでそれを取得します。 – JimmyD

+1

スカラー・パラメーター値の場合、 'setDate'のような適切なデータ・タイプ・セッターを指定してください。また、クエリ述部の列に関数を適用すると、索引が効率的に使用されなくなります。リダイレクトすることを検討してください。 'キャスト(O.materialrequireddate AS DATE)=キャスト(Getdate()AS DATE) 'をo.materialrequireddate AS DATE> =キャスト(Getdate()AS DATE)'として考えてください。 –

答えて

1

私は日付にキャストしないように、私のクエリを変更し、正しいタイプとパラメータを設定します。

Query query = session.createSQLQuery("SELECT Sum([qtyrequired]) as pcs, o.materialrequireddate, itemid " 
       + "FROM [materialManagement].[pcsorderrequirement] r JOIN materialmanagement.pcsorders o " 
       + "ON o.id = r.pcsorderid WHERE itemid IN (:items) " 
       + "AND Cast(o.materialrequireddate AS DATE) >= Cast(Getdate() AS DATE) " 
       + "AND o.materialrequireddate <= :endDate " 
       + "GROUP BY o.materialrequireddate, itemid").setParameterList("items", items.stream().map(Item::getId).collect(Collectors.toList())) 
       .setDate("endDate", Date.from(endDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); 
関連する問題