Requête HQL sur l'Ensemble de la Propriété
Supposons que j'ai le texte suivant HBM cartographie:
<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>
Dans mes études POJO, j'ai le texte suivant:
private Set<myClass> classes = new HashSet<myClass>();
public Set<myClass> getClasses() { return classes; }
public void setClasses(Set<myClass> classes) { this.classes = classes; }
Je veux exécuter la requête HQL suivante:
select count(*) from Student where classes.className = :myClassName
Cependant, hibernate jette l'exception suivante:
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]
Est-il possible d'exécuter une requête hql qui retourne des résultats basés sur les propriétés d'un Ensemble? Dans l'exemple ci-dessus, on peut vouloir à la requête pour tous les étudiants qui prennent "l'Algèbre I" ou d'un autre cours?
Edit: j'ai activé le approprié le mode de débogage pour obtenir d'Hibernation pour la sortie réelle de la requête SQL et voici la requête qu'il génère:
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;
OriginalL'auteur David | 2011-05-03
Vous devez vous connecter pour publier un commentaire.
Voici comment j'ai raison à ce sujet :
classes
est un Ensemble, et donc n'ont pas declassName
de la propriété. Une fois que vous traversez la relation à l'aide d'une jointure, vous obtenez un alias sur le myClass entité, qui a unclassName
propriété.Remarque: les classes en Java devrait toujours commencer par une majuscule. Renommer
myClass
àMyClass
.Oui il a un bon soutien. Avez-vous lu les réponses au post que vous avez envoyé. Vous n'avez pas à spécifier la clause de jointure comme en SQL, parce que la correspondance déjà définit la façon dont les tables sont liées entre elles. Avez-vous essayé ma requête? Lire docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/...
Je viens d'essayer votre requête et a obtenu l'erreur: "le Chemin prévu pour rejoindre! Chemin d'accès non valide: clazz.className"
vous avez accepté ma réponse. Pourquoi avez-vous eu le "Chemin prévu pour rejoindre" l'erreur?
OriginalL'auteur JB Nizet
Oui!
Sommes-nous sûrs que
org.myCompany.myClass
ha unclassName
propriété?Si oui, essayez quelque chose comme ceci
select count(*) from Student s inner join Classes c where c.className = :myClassName
J'ai été d'obtenir des résultats nuls parce que j'ai besoin d'ajouter LIKE '%chaîne de caractères%' à ma requête
OriginalL'auteur bpgergo