【问题标题】:JPA, Hibernate and Spring Data: convert strings to numbers in the where clause on MS SQL serverJPA、Hibernate 和 Spring Data:在 MS SQL 服务器的 where 子句中将字符串转换为数字
【发布时间】:2018-05-29 19:02:42
【问题描述】:

我正在做一个网络项目。它使用 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 上运行。

我有一个包含 nvarchar 字段的类

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

我能够在 MS SQL Server Management Studio(与 Java 无关的 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 中运行没有任何问题(它在 textOrNumber 字段中找到带有数字的记录):

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

【问题讨论】:

    标签: hibernate jpa spring-data spring-data-jpa jpa-2.0


    【解决方案1】:

    我通过以下方式使用 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 工作,我会选择他的帖子作为答案。

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2016-02-05
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2017-01-18
      • 2019-04-30
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多