2013-05-27 1 views
1

EclipseLink가있는 JPA 애플리케이션에는 Circular 엔티티에 Keyword 엔티티와 oneToMany 관계가 있습니다. 순환 엔티티에는 @Lob 유형의 두 가지 속성이 있습니다. 별개의 엔티티를 얻기 위해이 JQL을 실행할 때 다음 오류가 발생합니다. 어떻게 그러한 엔티티와 @Lob 속성을 가지고 distinct를 사용할 수 있습니까?@Lob 속성을 가진 엔티티와 다른 JQL

JQL 당신은 하위 쿼리로에만 별개의 식별자를 선택 쿼리를 업데이트하여이 문제를 얻을 수, 오류

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: Columns of type 'BLOB' may not be used in CREATE INDEX, ORDER BY, GROUP BY, UNION, INTERSECT, EXCEPT or DISTINCT statements because comparisons are not supported for that type. 
Error Code: -1 
Call: SELECT DISTINCT t0.ID, t0.BAIMAGE, t0.CIRCULARDATE, t0.CIRCULARLANGUAGE, t0.CIRCULARNUMBER, t0.CODE, t0.CONTENTS, t0.CREATEDAT, t0.DESCRIPTION, t0.FILENAME, t0.FILETYPE, t0.INTERNAL, t0.KEYWORDS, t0.NAME, t0.ORIGINATINGFILENO, t0.RETIRECOMMENTS, t0.RETIRED, t0.RETIREDAT, t0.TOPIC, t0.ADMINISTRATIVEDIVISION_ID, t0.CATEGORY_ID, t0.CREATER_ID, t0.PERSON_ID, t0.RETIRER_ID, t0.SIGNINGAUTHORITY_ID FROM CIRCULAR t0, CIRCULARKEYWORD t1 WHERE (((((t0.RETIRED = ?) AND (t0.ADMINISTRATIVEDIVISION_ID = ?)) AND (t1.RETIRED = ?)) AND ((UCASE(t0.CIRCULARNUMBER) LIKE ? OR UCASE(t0.TOPIC) LIKE ?) OR UCASE(t1.NAME) LIKE ?)) AND (t0.ID = t1.CIRCULAR_ID)) ORDER BY t0.NAME ASC 
    bind => [6 parameters bound] 
Query: ReportQuery(referenceClass=CircularKeyword sql="SELECT DISTINCT t0.ID, t0.BAIMAGE, t0.CIRCULARDATE, t0.CIRCULARLANGUAGE, t0.CIRCULARNUMBER, t0.CODE, t0.CONTENTS, t0.CREATEDAT, t0.DESCRIPTION, t0.FILENAME, t0.FILETYPE, t0.INTERNAL, t0.KEYWORDS, t0.NAME, t0.ORIGINATINGFILENO, t0.RETIRECOMMENTS, t0.RETIRED, t0.RETIREDAT, t0.TOPIC, t0.ADMINISTRATIVEDIVISION_ID, t0.CATEGORY_ID, t0.CREATER_ID, t0.PERSON_ID, t0.RETIRER_ID, t0.SIGNINGAUTHORITY_ID FROM CIRCULAR t0, CIRCULARKEYWORD t1 WHERE (((((t0.RETIRED = ?) AND (t0.ADMINISTRATIVEDIVISION_ID = ?)) AND (t1.RETIRED = ?)) AND ((UCASE(t0.CIRCULARNUMBER) LIKE ? OR UCASE(t0.TOPIC) LIKE ?) OR UCASE(t1.NAME) LIKE ?)) AND (t0.ID = t1.CIRCULAR_ID)) ORDER BY t0.NAME ASC") 

답변

3

circular을 가정한다

SQL is select DISTINCT c from CircularKeyword k join k.circular c where c.retired = false and c.administrativeDivision.id = 1 and k.retired = false and (upper(c.circularNumber) like '%3%' or upper(c.topic) like '%3%' or upper(k.name) like '%3%' ) order by c.name 

간단한 ID를 가지고 있습니다 :

SELECT k.circular FROM CircularKeyword k 
WHERE k.circular.id IN (SELECT DISTINCT c.id FROM CircularKeyword k2 
         JOIN k2.circular c ...rest of your query...) 

중요한 것은 DISTINCT c 대신 DISTINCT c.id을 요청하므로 생성 된 네이티브 SQL에 BLOB 열에 DISTINCT 문이 포함되지 않습니다.

1

이 문제를 해결하기 위해 할 수있는 또 다른 옵션은 @Lob을 별도의 엔티티로 묶는 것입니다. 이것은 실제 로브를 해결하려고하지는 않기 때문에 작동하지만 데이터베이스가 별개로 처리 할 수있는 로브 키 참조 만 작동합니다. 나는 제공된 정보를 가지고 예제에 작업 코드 조각을 적용했다.

원형 법인

//Other attributes, and ids omitted 

@ManyToOne() 
@JoinColumn(name = "LOB_ATTRIBUTE_1_KEY") 
LobAttribute lobAttribute1; 

@ManyToOne() 
@JoinColumn(name = "LOB_ATTRIBUTE_2_KEY") 
LobAttribute lobAttribute2; 

LobAttribute 법인

@Id 
@Column(name = "LOB_ATTRIBUTE_KEY") 
Long lobAttributeKey; 

@Lob 
@Basic(fetch = FetchType.LAZY) 
@Column(name = "LOB") 
String lob; 

내가하지 특히 ​​다음과 같이 할 수 있지만, 나는 그것이 쿼리와 모델에 대한 최소한의 제한 최고의 솔루션입니다 생각합니다. 나는 이것이 이것을 가로 질러 오는 다른 누구에게 도움이되기를 바랍니다.

관련 문제