2016-10-03 3 views
0

에서 나는 할 노력하고있어이 선택 :JPA, NOT IN 봄 Webservice를 선택하고

JPA/봄 내 시스템에서
SELECT c FROM Incident c 
WHERE c.incidentID IN 
    ( 
    SELECT DISTINCT d.incidentID FROM TagIncident d WHERE tagName IN (d.tagName=?1) 
    AND d.incidentID NOT IN 
    (SELECT a.incidentID FROM TagIncident a WHERE tagName IN (a.tagName=?2))  
) 

나는 오류 받고 있어요 :

"HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: An exception occurred while creating a query in EntityManager:" 

을 구문에서 내가 잘못하고있는 것이 있습니까? 데이터베이스 (HANA)에서 테스트했는데 문제가 없었습니다.

도움 주셔서 감사합니다.

편집 이상의 오류가

내 최신 시도가 있었다 로그 :

SELECT c FROM Incident c WHERE c.incidentID IN 
(SELECT DISTINCT d.incidentID FROM TagIncident d WHERE d.tagName IN 
(d.tagName=?1) AND d.incidentID NOT IN 
(SELECT a.incidentID FROM TagIncident a WHERE a.tagName IN (a.tagName=?2))) 

편집

Exception Description: Syntax error parsing [SELECT c FROM Incident c WHERE c.incidentID IN (SELECT DISTINCT d.incidentID FROM TagIncident d WHERE d.tagName IN (d.tagName=?1) AND d.incidentID NOT IN (SELECT a.incidentID FROM TagIncident a WHERE a.tagName IN (a.tagName=?2)))]. [117, 131] 
The expression at index {0} is not a valid expression. [215, 229] 
The expression at index {0} is not a valid expression.; nested exception is java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Syntax error parsing [SELECT c FROM Incident c WHERE c.incidentID IN (SELECT DISTINCT d.incidentID FROM TagIncident d WHERE d.tagName IN (d.tagName=?1) AND d.incidentID NOT IN (SELECT a.incidentID FROM TagIncident a WHERE a.tagName IN (a.tagName=?2)))]. [117, 131] 
The expression at index {0} is not a valid expression. [215, 229] 
The expression at index {0} is not a valid expression.] with root cause Local Exception Stack: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing [SELECT c FROM Incident c WHERE c.incidentID IN (SELECT DISTINCT d.incidentID FROM TagIncident d WHERE d.tagName IN (d.tagName=?1) AND d.incidentID NOT IN (SELECT a.incidentID FROM TagIncident a WHERE a.tagName IN (a.tagName=?2)))]. [117, 131] 
The expression at index {0} is not a valid expression. [215, 229] 
The expression at index {0} is not a valid expression. 

최신 시도 :

List<String> list_add_tags = new ArrayList<String>(); 
List<String> list_remove_tags = new ArrayList<String>(); 

// creating custom sql_query 
String sql_query = "SELECT c FROM Incident c WHERE c.incidentID IN (SELECT DISTINCT(d.incidentID) FROM TagIncident d WHERE d.tagName IN (:add_tags) AND d.incidentID NOT IN (SELECT a.incidentID FROM TagIncident a WHERE a.tagName IN (:remove_tags)))"; 

TypedQuery<Incident> query = em.createQuery(sql_query, Incident.class); 

query.setParameter("add_tags", list_add_tags); 
query.setParameter("remove_tags", list_remove_tags); 

return query.getResultList(); 

여전히 작동하지 않습니다. = (

ERROR :

You have attempted to set a value of type class java.util.ArrayList for parameter add_tags with expected type of class java.lang.String 
+0

사용하는 JPA 제공자 :

JPA 사양은 예에서이 유효한 구문, 지원이 있어야하므로, 어떠한 JPA 제공자를 보여? Hibernate, EclipseLink, OpenJPA 또는 잘 알려지지 않은 DataNucleaus, Toplink, ObjectDB 중 하나? Hibernate에서는 4.6.17.5 절의 JPA 스펙에있는 예제와 같이 목록을 할당 할 수 있지만 자신의 말로 보너스 기능으로 지원한다고 생각했습니다. 어쩌면 당신은 매개 변수 주위에 괄호를 제거해야합니까? 공식적인 예는 당신이 그들을 필요로하지 않아야 함을 의미합니다. – coladict

+0

EclipseLink 2.6.0, 목록에서 IN으로부터 괄호를 제거했는데 효과가있었습니다. 어떻게하면 이해할 수 있습니까? 내 JPA 버전을 어떻게 확인합니까? –

답변

1

정상적으로 켜짐 LY 내가 그들을 쉽게 테스트 할 수 있기 때문에, 네이티브 쿼리를 사용하지만이 시도 :이 query.setParameter("tag", theListOfTags)와 함께 작동합니다

SELECT c FROM Incident c 
WHERE c.incidentID IN 
    ( 
    SELECT DISTINCT d.incidentID FROM TagIncident d WHERE tagName IN :at 
    AND d.incidentID NOT IN 
    (SELECT a.incidentID FROM TagIncident a WHERE tagName IN :rt)  
) 

. 5.0.7 이전의 Hibernate 버전은 괄호 안의 매개 변수에 문법 문제가 있음을 명심하자.

빈 목록도 구문 오류를 생성합니다.

SELECT e 
FROM Employee e 
WHERE TYPE(e) IN :empTypes 
+0

태그가 다르면 태그는 내가 마지막으로 원하지 않는 것입니다. 선택하고 두 번째 태그에서 원하는 태그를 선택하십시오. 나는 괄호없이 시도 할 것이다. 감사합니다. –

+0

'tag'라고 부를 필요는 없습니다. 그것은 단지 명명 된 매개 변수를 사용하기 때문에 위치 지정을 사용하지 않고'setParameter'를 두 번 호출하거나 매개 변수가 많은 복잡한 쿼리의 위치를 ​​추적 할 필요가 없습니다. 가장 큰 수정은 IN (value of list) 부분과 비교하기 때문에 거기에서'[ad] .tagName =? 1'을 제거하는 것입니다. – coladict

+0

당신 말이 맞아요! 그것은 목록입니다! 나는 그것을 시도 할 것이다, 고마워! –

0

JPA 쿼리 또한

SELECT c FROM Incident c, TagIncident t 
WHERE c.incidentID = t.incidentID 
AND t.tagName = ?1 
AND t.tagName != ?2 

최대 절전 로깅을 사용할 경우 다음 생성 된 쿼리를보고 그들이에서 작동하는지 볼 수 있습니다를 사용해보십시오 외부 SQL 프로그램

logging.level.org.hibernate=DEBUG 
+0

이 SQL은 다른 결과를 가져옵니다. = ( 그와 동등하지 않습니다. Bean에서이 Logging을 어디에서 설정합니까? –

+0

스프링 부트를 사용하는 경우이 속성을'application.properties' 파일에 넣을 수 있습니다. – 11thdimension