2017-12-15 15 views
0

웹 프로젝트를 수행하고 있습니다. 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를 (자바와는 아무 상관이없는 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보다 큰 여기

내가 자바로 무엇을 누구의 값 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 또는 다른 것을 사용하여 어떻게 해결할 수 있습니까?

추가 정보 :이 아무 문제없이 JPA에서 실행

(가 textOrNumber 필드에 숫자 레코드를 찾습니다) :

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

답변

0

나는 MS SQL 서버 변환 사용하여이 문제를 해결 다음과 같은 방법 :

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

누군가가 CAST 작업을 할 수 있으면 나는 그의 게시물을 답으로 선택합니다.

희망은 다른 사람들에게 도움이되기를 바랍니다.