2011-10-11 1 views
0

Прежде всего, пожалуйста, простите меня, что мой словарь немного ограничен NHibernate, поэтому я могу назвать что-то не так ... вот мой вопрос:Ошибка в HQL Query различного количества дочерних коллекций (в элементах error)

Результат, который я ищу, - это количество отдельных студентов для курса. У меня есть три класса: Курсы, студенты, CourseDates. Курсы содержат отношения HasMany с CourseDates. CourseDates - это набор дат, на которых произошел каждый класс, и содержит отношения HasAndBelongsToMany со классом Students.

Что мне нужно сделать, так это получить отчетливое количество учеников со всех дат прохождения курса. Вот пример SQL-запроса, который я хочу реплицировать. Результатом является число (длинное). Этот конкретный пример дает результат: 5

SELECT COUNT(DISTINCT dbo.Literacy_Course_DatesStudents.IDStudent) AS StudentCount FROM Literacy_Course_DatesStudents INNER JOIN Literacy_Course_Dates ON Literacy_Course_DatesStudents.IDDate = Literacy_Course_Dates.IDDate WHERE (Literacy_Course_Dates.IDCourse = 28)

Ниже запрос написан внутри нового класса, который я создал специально для этого отчета ... но я получаю сообщение об ошибке: исключение типа «Antlr. Runtime.MissingTokenException '. Обычно я думал, что эта ошибка была брошена, когда у меня не было класса CourseEnrolledCount, импортированного в другие классы, но я это сделал.

Dim q As Castle.ActiveRecord.Queries.SimpleQuery(Of CourseEnrolledCount) 
q = New Castle.ActiveRecord.Queries.SimpleQuery(Of CourseEnrolledCount)(GetType(Literacy.Courses.CourseDates), "select new CourseEnrolledCount(Count(Distinct o.IDStudent in elements(t.Students) as o)) from CourseDates t Where t.Course.IDCourse = :courseid") 

Сообщите мне, если мне нужно предоставить дополнительную информацию. Надеюсь, в моем вопросе я буду ясно. Заранее благодарю за ваше время.

ответ

0

Вот HQL запрос, который делает то, что вы хотите:

select count(disctinct student.id) from Course course 
inner join course.courseDates courseDate 
inner join courseDate.students student 
where course.id = :courseId 

Я дам вам заменить реальные имена ассоциаций.

Вы можете даже сделать его короче (и более похожи на ваш запрос), избегая вступать в курсе:

select count(disctinct student.id) from CourseDate courseDate 
inner join courseDate.students student 
where courseDate.course.id = :courseId 
+0

YAY! Оба они отлично работали! Я выбрал более короткий. Огромное спасибо! Я боролся с этим в течение двух дней. – EHeine

Смежные вопросы