JPA、Hibernate 和 Spring 数据:在 MS SQL 服务器上的 where 子句中将字符串转换为数字
JPA, Hibernate and Spring Data: convert strings to numbers in the where clause on MS SQL server
我正在做一个网络项目。它使用 Spring (5.0.2.RELEASE)、Hibernate (5.2.12.Final) 和 Spring 数据 (2.0.2.RELEASE)。这些是最新版本,因此我可以使用 JPA 2.1。 Windows 和 MS SQL Server 2014 Enterprise 上的网站 运行。
我有一个 class 具有 nvarchar 字段
Class1 {
....
@Column(columnDefinition = "NVARCHAR(20)")
private String textOrNumber = null;
...
}
我能够 运行 在 MS SQL Server Management Studio 中成功地对数据库进行以下本机查询(与 [=44= 无关的 Windows 程序]) 。
SELECT c.textOrNumber FROM Class1 c WHERE ISNUMERIC(c.textOrNumber ) = 1
AND CAST(c.textOrNumber AS DECIMAL(17,2)) > 0
以上查询能够找到 textOrNumber
上的值是大于 0 的数字(整数或小数 )的记录。
这是我在 Java 中的内容:
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
或其他方法解决此问题?
附加信息:
JPA 中的 运行s 没有任何问题(它在 textOrNumber 字段中找到带有数字的记录):
SELECT c FROM Class1 c WHERE ISNUMERIC(c.textOrNumber ) = 1
我通过以下方式使用 MS SQL 服务器的 CONVERT 解决了这个问题:
em.createQuery("SELECT c FROM Class1 c WHERE ISNUMERIC(c.textAndNumber) = 1 AND
CONVERT(DECIMAL(17,2), c.textAndNumber) > 3");
如果有人能使CAST工作,我会select他的post作为答案。
希望这对其他人有帮助。
我正在做一个网络项目。它使用 Spring (5.0.2.RELEASE)、Hibernate (5.2.12.Final) 和 Spring 数据 (2.0.2.RELEASE)。这些是最新版本,因此我可以使用 JPA 2.1。 Windows 和 MS SQL Server 2014 Enterprise 上的网站 运行。
我有一个 class 具有 nvarchar 字段
Class1 {
....
@Column(columnDefinition = "NVARCHAR(20)")
private String textOrNumber = null;
...
}
我能够 运行 在 MS SQL Server Management Studio 中成功地对数据库进行以下本机查询(与 [=44= 无关的 Windows 程序]) 。
SELECT c.textOrNumber FROM Class1 c WHERE ISNUMERIC(c.textOrNumber ) = 1
AND CAST(c.textOrNumber AS DECIMAL(17,2)) > 0
以上查询能够找到 textOrNumber
上的值是大于 0 的数字(整数或小数 )的记录。
这是我在 Java 中的内容:
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
或其他方法解决此问题?
附加信息:
JPA 中的 运行s 没有任何问题(它在 textOrNumber 字段中找到带有数字的记录):
SELECT c FROM Class1 c WHERE ISNUMERIC(c.textOrNumber ) = 1
我通过以下方式使用 MS SQL 服务器的 CONVERT 解决了这个问题:
em.createQuery("SELECT c FROM Class1 c WHERE ISNUMERIC(c.textAndNumber) = 1 AND
CONVERT(DECIMAL(17,2), c.textAndNumber) > 3");
如果有人能使CAST工作,我会select他的post作为答案。
希望这对其他人有帮助。