2012-07-27 3 views
0

Struts + Spring + Hibernate를 사용하고 있으며 HQL을 제대로 실행하는 데 문제가 있습니다.Hibernate (HQL)에서 내부 조인에 문제가 발생했습니다.

나는 objectA, objectB, objectC 및 objectD 네 개의 개체가 있습니다. 오브젝트 A는 오브젝트 B와 일대 다의 관계를 가지고 있으며, 오브젝트 B는 FK ObjectA.Id를 가지고 있으므로 관계가 있습니다. 이 패턴은 객체를 통해 계속됩니다. 즉, 객체 B는 객체 C 등과 1 대 다수의 관계를 가지고 있습니다.

지금부터 "FROM ObjectXVO WHERE objectXId =?" 개체 목록을 얻으려면. 내 응용 프로그램이 복잡 해져서 좀 더 복잡한 HQL을 할 필요가있다.

기본적으로 주어진 ObjectBVO.objectBId 주어진 ObjectB를 가진 ObjectA의 특정 열, 주어진 ObjectB의 일부인 ObjectCs의 특정 열 및 ObjectDs의 모든 열을 반환해야합니다. 지정된 ObjectB의 일부인 ObjectC의 일부

이것은 Microsoft SQL Server에서 사용하고있는 SQL 문입니다. 그것은 작동하고 잘하면 내 모델을 보여줍니다.

SELECT ObjectB.ObjectBID, ObjectB.ObjectBName, ObjectC.ObjectCDescription, 
ObjectD.*, ObjectA.ObjectAID 
FROM ObjectB, ObjectC, ObjectD, ObjectA 
WHERE ObjectB.ObjectBID = 2 
AND ObjectA.ObjectAID = ObjectB.ObjectAID 
AND ObjectB.ObjectBID = ObjectC.ObjectBID 
AND ObjectD.ObjectCID = ObjectC.ObjectCID 

은 DAOimpl의 코드가 나는 목록 < ObjectDVO>

List<ObjectDVO> objectDs; 
try{ 
String hql = "SELECT ObjectBVO.objectBId, ObjectBVO.objectBName, 
    ObjectCVO.objectCDescription, ObjectCVO.objectCId," 
+" ObjectAVO.objectAId, ObjectAVO.objectAName, ObjectDVO" 
    +" FROM ObjectBVO, ObjectAVO, ObjectCVO, ObjectDVO" 
    +" WHERE ObjectBVO.objectBId = ?" 
+" AND ObjectAVO.objectAId = ObjectBVO.objectAId" 
+" AND ObjectBVO.objectBId = ObjectCVO.objectBId" 
+" AND ObjectDVO.objectCId = ObjectCVO.objectCId"; 
objectDs = getHibernateTemplate().find(hql, objectBID); 
} 

이 그냥 던져 오류가 null의 말을 반환하는 데 사용하려고 해요 개체입니다. 나는 HQL 문서와 튜토리얼을 살펴 보았지만이 작업을 여러개의 VO 객체로하는 것은 분명하지 않다. 누구든지 도와 줄 수 있습니까? 감사.

답변

1

엔티티에 별칭을 할당하고 해당 별칭을 반환하거나 사용해야합니다.

또한 설명에 따르면 엔티티간에 OneToMany/ManyToOne 연관이 있어야하지만 정렬에는 아무 것도 없습니다. 당신이 가지고있는 것은 다른 개체를 가리키는 ID입니다.

이와 같은 여러 필드를 반환하는 쿼리는 ObjectDVO의 인스턴스를 반환하지 않습니다. 각각 을 반환합니다. 각 Object[]에는 쿼리에서 반환 한 값 중 하나가 포함됩니다 (인덱스 0의 objectBId, 인덱스 1의 개체 BName 등).

마지막으로 VO는 엔티티가 아닙니다. 엔티티의 이름을 VO로해서는 안됩니다. 기본적으로 동물에 접미어 Fruit을 추가하는 것과 같습니다. 당신이 엔티티를 유지하는 경우

어쨌든, 같이 (당신이 대신 협회를 소개하지 않아야 함), 쿼리는 다음과 같아야합니다 ManyToOne 협회와

select b.objectBId, b.objectBName, c.objectCDescription, c.objectCId, 
     a.objectAId, a.objectAName, d 
from ObjectBVO b, ObjectAVO a, ObjectCVO c, ObjectDVO d 
where b.objectBId = ? 
and a.objectAId = b.objectAId 
and b.objectBId = c.objectBId 
and d.objectCId = c.objectCId 

을, 당신은 단순히

을 할 수
select d from D d 
inner join fetch d.c c 
inner join fetch c.b b 
inner join fetch b.a a 

그리고 List<D>이 표시됩니다. 각 D 인스턴스에서 수행 할 수있는 작업은 다음과 같습니다.

String nameOfA = d.getC().getB().getA().getName(); 

마지막주의 : 속성은 클래스의 일부입니다. 따라서 objectAId이라는 ID는 ObjectA이라는 ID는 중복됩니다. 이름은 id : objectA.getId()objectA.getObjectAId()보다 훨씬 읽기 쉽습니다.

+0

대단한 답변을 보내 주셔서 감사합니다.나는 이것을 시험해보고 그것을 작동시킬 수 있다면 그것을 대답으로 표시 할 것입니다. – user1287523

+0

은 아름답게 작동합니다. – user1287523

관련 문제