Ошибка в HQL-запросе различного количества дочерних коллекций (в элементах ошибка) - PullRequest
0 голосов
/ 11 октября 2011

Прежде всего, пожалуйста, прости меня за то, что мой словарный запас немного ограничен NHibernate, поэтому я могу назвать что-то не так ... вот мой вопрос:

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

Что мне нужно сделать, так это получить четкое количество студентов за все даты, когда курс прошел.Вот пример оператора 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")

Дайте мне знать, если мне нужно предоставить дополнительную информацию.Я надеюсь, что я проясняю свой вопрос.Заранее спасибо за ваше время.

1 Ответ

0 голосов
/ 11 октября 2011

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

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

Я позволю вам подставить настоящие имена ассоциаций.

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

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