웹 프로젝트를 수행하고 있습니다. 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