Запрос HQL для свойства Set

Предположим, у меня есть следующее отображение HBM:

<class name="Student" table="student">
    <set name="classes" table="student_classes" cascade="none">
        <key column="studentId" />
        <many-to-many column="classId" class="org.myCompany.myClass" />
    </set>
</class>

В моем студенческом POJO у меня есть следующее:

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

Однако спящий режим вызывает следующее исключение:

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» или другой курс?

Изменить: я включил соответствующий режим отладки, чтобы Hibernate выводил настоящий 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;

person David    schedule 03.05.2011    source источник


Ответы (2)


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

Вот как я рассуждаю по этому поводу: classes - это Set и, следовательно, не имеет свойства className. После прохождения отношения с помощью соединения вы получите псевдоним объекта myClass, который имеет свойство className.

Примечание: классы в Java всегда должны начинаться с заглавной буквы. Переименуйте myClass в MyClass.

person JB Nizet    schedule 03.05.2011
comment
На самом деле HQL не имеет хорошей поддержки внутреннего соединения (см. coderanch. com / t / 218169 / ORM / java / Inner-Join-HQL). My Set содержит объекты типа myClass, у которых есть свойство className. Я хочу выполнить запрос на основе этого свойства className (а не свойства самого набора). - person David; 03.05.2011
comment
Да, у него хорошая поддержка. Вы читали ответы на отправленный вами пост? Вам просто не нужно указывать предложение on соединения, как в SQL, потому что отображение уже определяет, как таблицы связаны друг с другом. Вы пробовали мой запрос? Прочтите docs.jboss.org/hibernate/ core / 3.6 / reference / en-US / html_single / - person JB Nizet; 03.05.2011
comment
Я только что попробовал ваш запрос и получил сообщение об ошибке: Ожидаемый путь для соединения! Неверный путь: clazz.className - person David; 03.05.2011
comment
@ Дэвид: ты принял мой ответ. Почему у вас ожидался путь для ошибки соединения? - person JB Nizet; 03.05.2011

Можно ли запустить запрос hibernate, который возвращает результаты на основе свойств набора?

Да!

В приведенном выше примере

Мы уверены, что у org.myCompany.myClass есть className собственность? Если да, попробуйте что-нибудь вроде этого select count(*) from Student s inner join Classes c where c.className = :myClassName

person bpgergo    schedule 03.05.2011
comment
Когда я более внимательно посмотрел на свой фактический запрос, мне не хватало c. псевдоним перед className (который вызывал ошибку). Однако теперь я получаю 0 результатов по запросу (вместо ожидаемого количества результатов. - person David; 03.05.2011
comment
Я не получал результатов, потому что мне нужно было добавить LIKE '% string%' к моему запросу - person David; 03.05.2011