私は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