2012-05-18 4 views
0

저는 MySQL에 두 개의 테이블을 가지고 있습니다.SQL과 HQL은 두 테이블에서 데이터를 가져옵니다.

message -> msg_id(pk) and message(varchar) 
track_record -> tr_id(pk), msg_id (foreign key), object_id (to whom the message is sent), profile_id(who sent the message) 

이제 object_id가 지정된 메시지와 보낸 사람 프로필 ID를 제공하는 단일 쿼리를 만들고 싶습니다.

예 내가 내가

SELECT m.message, u.profile_profile_id FROm `message` as m, `user_track_record` as u 
WHERE msg_id IN 
     (SELECT message_msg_id FROM user_track_record WHERE object_profile_id = 1) 
     and u.profile_profile_id IN 
     (SELECT profile_profile_id from `user_track_record` WHERE object_profile_id = 1) 
을 시도 내 쿼리를 추가 1.

편집 한 대답을 ID로 사용자에게 전송되는 모든 메시지를보고 싶어 지금 OBJECT_ID 1.

이 있다고

SQL과 HQL 모두에서이 작업을 수행하고 싶습니다. 도움을 주시면 감사하겠습니다. 감사합니다

+0

@JBNizet 와 ManyToOne 연관이있다? –

+0

나는 위의 테이블을 언급했다 ... 먼저 SQL 쿼리에서 할 노력하고있어 그때 나는 그것을 hql로 변환하려고합니다. 내 ENTITIES (메시지 및 user_track_record)에서 시도한 SQL이 지금 질문에 있습니다. –

답변

0

SQL 쿼리가 너무 복잡합니다. 간단한 것들로

시작 :

사용자 1로 전송 된 모든 track_records를 선택 :

select tr.* from track_record tr where tr.object_id = 1 

이제 트랙 레코드에 링크 된 메시지를 싶습니다. 이 조인을 사용하여 수행됩니다 :

select tr.*, m.* from track_record tr 
inner join message m on m.msg_id = tr.msg_id 
where tr.object_id = 1 

지금 만 보낸 사람의 ID 및 메시지 본문을 싶습니다

select tr.profile_id, m.message 
from track_record tr 
inner join message m on m.msg_id = tr.msg_id 
where tr.object_id = 1 

HQL에서 쿼리가 거의 동일합니다. Message 엔티티와 TrackRecord 엔티티가 있습니다. TrackRecord에는 Message와의 ManyToOne 연관이 있습니다. 또한 송신자와 지금 내 질문에 대답하십시오 수 수신기

select tr.sender.id, m.message 
from TrackRecord tr 
inner join tr.message m 
where tr.receiver.id = 1 
+0

고맙습니다 ... 완전히 내 문제. 그리고 네, 그게 제 문제입니다. 저는 항상 복잡한 해결책을 찾으러갑니다. "간단하게 시작하라"고 말한 것처럼 "접근법"을 제안 할 수 있습니까? –

+0

위의 hql은 객체 목록을 반환하고 있습니다. String 메시지와 Integer senderId가 포함 된 pojo를 만들었습니다. 그리고 목록을 가져 오는 중입니다 Query2 = session.createQuery (query.toString()); List messages = (List <사용자 메시지>) query2.list(); 제안 사항이 있으십니까? –

관련 문제