2016-08-04 10 views
0

내 쿼리를 만들기 위해 hibernate/hql을 사용하고 있습니다.HQL은 누락 된 매핑이있는 외부 조인을 남겼습니다.

는 내가로부터 정보를 얻을 필요가 3 표를 얻었다, 내가 가진 연결/할당 테이블 : 지금 나는 나의 sorrounding와 여기에 상황을 이해하기 위해, 이제 꽤 시간에 갇혀있어 문제가있어 5 전체. 필요한 정보는 Key, Type 및 SourceFile입니다. 그러나 특별한 경우는 입니다. 새 데이터를 가져 오는 동안 sql이 완료 될 것이므로 먼저 데이터가 이거나 이미 존재하는지 확인하고 싶습니다. . 키 자체가 이미 데이터베이스에있는 경우 Type 또는 SourceFile 에 관계없이 내 쿼리에서 항상 키를 제공해야합니다. 그러면 키만 원하고 다른 키는 원하지 않습니다. 정보. (Key matches이지만 SourceFile과 Type은 일치하지 않습니다. 따라서 키만 원합니다) Key가 정확히 동일한 Type 및 SourceFile로 존재한다면 모든 정보를 얻고 싶습니다.

테이블은 다음과 같습니다

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| K_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| key   | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 
:

키 (머리 위로 FK_K_ID는 이름의 키를 가진 개체로 저장이 FK_S_ID이 유형으로 저장 소스 및 FK_T_ID로 저장됩니다)

에 KeyType :

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| KT_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| FK_K_ID  | bigint(20) | NO |  | NULL |    | 
| FK_T_ID  | bigint(20) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

유형 :

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| T_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | NO |  | NULL |    | 
| description | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

KeySource :

소스
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| KS_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| FK_K_ID  | bigint(20) | NO |  | NULL |    | 
| FK_S_ID  | bigint(20) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

이 하나의 문제는

from KeyType kt 
right outer join kt.Key k 
with k.name in (...) 
where k.deleted = false 
and (kt.Type in (...) or kt is null) 

, 그 종류

: 여기

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| S_ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| sourceFile | varchar(255) | NO |  | NULL |    | 
| deleted  | boolean  | NO |  | FALSE |    | 
+-------------+--------------+------+-----+---------+----------------+ 

과 내가 지금까지 뭘하려 내가 원하는 걸 해낸다. 하지만 데이터베이스에서 모든 키를 가져오고 KeyType은 일치하는 경우에만, 그렇지 않으면 null입니다. 나는 모든 열쇠를 얻고 싶지 않습니다. 단지 제가 요청한 열쇠를 얻고 싶습니다.

from KeyType kt 
right outer join kt.Key k 
with k.name in (...) 
where k.deleted = false 
and (k.name in (...) and kt.Type in (...) or kt is null) 

내가 솔직히 여기에서 시도한 것을 모르겠다. 나는 내가 요청한 키만 제공하도록 첫 번째 쿼리를 최적화하려고 노력했다.

from KeyType kt 
right outer join fetch kt.Key k 
where k.deleted = false 
and (k.name in (...) and kt.Type in (...) or kt is null) 
나는 이와 같은 가져 오기를 사용하거나 다른 변형으로 사용하려고했지만 필요한만큼 작동하지 않았습니다.

from Key k 
left outer join KeyType kt on kt.Key.id = k.id 
left outer join KeySource ks on ks.Key.id = k.id 
inner join Source s on ks.Source.id = s.id 
where k.deleted = false 
and k.name in (...) 
and (kt.appType in (...) or kt is null) 
and (s.SourceFile in (...) or s is null) 

잘 예상대로 작동하지 않습니다. 나는 그것이 작동 할 수 없다는 것을 알기 위해 아주 단순한 것을 의미하지만, 당신이 그것에 매달릴 수 없다면 을 많이 시도해보십시오.

나는 더 많은 조합과 querys 변형을 시도했지만 운이 없었습니다. 첫 번째 쿼리는 내가 가진 가장 가까운 쿼리입니다. 누군가가 나를 도울 수 있기를 바랍니다.

추신 : 매핑이나 엔티티를 지금 변경할 수 없습니다.내가 가진 것과 함께 일해야 해.

는 UPDATE :

이 좋아, 그래서 문제 해결에 매우 근접입니다. 내 검색어는 다음과 같이 표시됩니다.

select k, case when kt.Type not in (...) then null 
       else 1 end 
from KeyType kt 
join kt.Key k 
where k.name in (...) 

이제 내가 원하는 것은 실제 개체와 1을 교환하는 것입니다. 하지만 이렇게하면 "org.hibernate.exception.GenericJDBCException : oracle db에서 실행중인 쿼리를 실행할 수 없습니다"오류가 발생합니다.

누군가가 해결 방법을 말해 줄 수 있습니까?

답변

0

내 경우에는 내가하고 싶었던 방식으로 할 수 없습니다.

그래서 동료들에게 다시 물었고 우리는 단일 쿼리에서 해결해야 할 해결책을 찾았습니다.

동일한 게시물 구성/문제로이 게시물을 통과 한 모든 사람에게이 내용을 말하면됩니다.