2011-05-03 4 views
3

나는 다음과 HBM 매핑을 가지고 있다고 가정HQL 쿼리

private Set<myClass> classes = new HashSet<myClass>(); 
public Set<myClass> getClasses() { return classes; } 
public void setClasses(Set<myClass> classes) { this.classes = classes; } 

나는 다음과 같은 HQL 쿼리를 실행하려면 :

select count(*) from Student where classes.className = :myClassName 

하지만 Hibernate 다음 예외 예외 :

ERROR [service-j2ee-4] PARSER.reportError(33) | Invalid path: 'classes.className' 
ERROR [service-j2ee-4] PARSER.reportError(33) | <AST>:0:0: unexpected end of subtree 
ERROR [service-j2ee-4] PARSER.reportError(33) | left-hand operand of a binary operator was null 
org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'classes.className' [select count(*) from Student where classes.className = :myClassName and 1=1] 

집합의 속성을 기반으로 결과를 반환하는 최대 절전 모드 쿼리를 실행할 수 있습니까? 위의 예에서 우리는 '대수 I'또는 다른 과목을 듣는 모든 학생을 검색 할 수 있습니다. 편집

: 나는 그것이 실제 SQL 쿼리의 출력에 최대 절전 모드 얻기 위해 적절한 디버그 모드를 활성화하고 여기에서 생성하는 쿼리입니다 : 어떻게 이유 그것에 대해

select count(*) as col_0_0_ 
from student student0_, student_classes student1_, classes student2_ 

where student0_.studentId=student1_.studentId and student1_.classId=student2_.classId and student2_.className LIKE 'algebra' and 1=1; 

답변

3
select count(s.id) from Student s 
inner join s.classes clazz 
where clazz.className = :myClassName 

은 다음과 같습니다 classes 집합이며 따라서 className 속성이 없습니다. 조인을 사용하여 관계를 트래버스하면 className 속성이있는 myClass 엔터티에 별칭이 생깁니다.

참고 : Java 클래스는 항상 대문자로 시작해야합니다. myClassMyClass으로 바꿉니다.

+0

처럼 뭔가를하려고하면 사실 HQL 좋은 가입 내부 지원하지 않습니다 (http://www.coderanch.com/t/218169/ORM/java/Inner-Join-HQL 참조). My Set에는 className이라는 속성을 가진 myClass 유형의 객체가 포함되어 있습니다. 해당 className 속성 (집합 자체의 속성이 아님)을 기반으로 쿼리하려고합니다. – David

+0

네, 잘 지원합니다. 보낸 게시물에 대한 답변을 읽었습니까? 매핑은 이미 테이블이 함께 링크되는 방법을 정의하기 때문에 SQL에서와 같이 조인의 on 절을 지정하지 않아도됩니다. 내 질문을 해봤 니? 읽기 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-joins –

+0

방금 ​​쿼리를 시도하고 오류가 발생했습니다 : "참여 예상 경로! 잘못된 경로 : clazz .className " – David

0

Is it possible to run a hibernatequery which returns results based on properties of a Set?

예!

In the above example

우리는 확실히 org.myCompany.myClass헥타르 className 재산? 예,이 select count(*) from Student s inner join Classes c where c.className = :myClassName

+0

실제 쿼리를 자세히 살펴보면 "c"가 누락되었습니다. className 앞에 별칭 (오류를 던지고 있던 클래스). 그러나 이제 결과의 예상 수 대신 쿼리에서 0 개의 결과가 나타납니다. – David

+0

LIKE '% string %'을 (를) 쿼리에 추가해야하므로 0 인 결과가 나타납니다. – David