내 쿼리를 만들기 위해 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에서 실행중인 쿼리를 실행할 수 없습니다"오류가 발생합니다.
누군가가 해결 방법을 말해 줄 수 있습니까?