2017-12-15 9 views
0

私はWebプロジェクトを行っています。 Spring(5.0.2.RELEASE)、Hibernate(5.2.12.Final)、Spring Data(2.0.2.RELEASE)を使用します。これらは最新のバージョンなので、JPA 2.1を入手できます。このウェブサイトは、WindowsおよびMS SQL Server 2014 Enterprise上で動作します。JPA、Hibernate、Spring Data:文字列をMS SQLサーバーのwhere句の数値に変換します。

私はMS SQL Server Management Studioの(Javaのとは何の関係もありませんWindowsプログラム)で正常にデータベースに対して次のネイティブクエリを実行することができる午前

Class1 { 
    .... 
    @Column(columnDefinition = "NVARCHAR(20)") 
    private String textOrNumber = null; 
    ... 
} 

をnvarchar型のフィールドを持つクラスを持っています。

SELECT c.textOrNumber FROM Class1 c WHERE ISNUMERIC(c.textOrNumber) = 1 
    AND CAST(c.textOrNumber AS DECIMAL(17,2)) > 0 

上記のクエリは、0より大きいここ

は、私はJavaで持っているもので、その値はtextOrNumberにある数字を記録(整数または小数)を見つけることができます:

Query q = em.createQuery("SELECT c FROM Class1 c WHERE ISNUMERIC(c.textOrNumber) = 1 " 
+ "AND CAST(c.textOrNumber AS DECIMAL(17,2))"); 
return q.getResultList(); 

ここに、エラーメッセージがあります:

Caused by: 
org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 122 [SELECT c FROM mytest.Class1 c WHERE ISNUMERIC(c.textOrNumber) = 1 AND CAST(c.textOrNumber AS DECIMAL(17,2)) > 2] 
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) 
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:291) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:186) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) 
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553) 
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) 
    at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 

CASTなどを使用してこれを修正するにはどうすればよいですか?

追加情報:

これは(それがtextOrNumberフィールド上の番号を持つレコードを検索します)何の問題もなくJPAで動作します:

SELECT c FROM Class1 c WHERE ISNUMERIC(c.textOrNumber) = 1 

答えて

0

私はMS SQL ServerからのCONVERT使用することによって、この問題を解決次のようになります。

em.createQuery("SELECT c FROM Class1 c WHERE ISNUMERIC(c.textAndNumber) = 1 AND 
    CONVERT(DECIMAL(17,2), c.textAndNumber) > 3"); 

誰かがCASTの仕事をすることができれば、彼の回答を回答として選択します。

希望は他の人に役立ちます。

関連する問題