À l'aide de requêtes HQL pour sélectionner à partir de tables jointes avoir un à plusieurs " de la relation entre eux
Je suis coincé avec ce Hibernate chose et ne sais pas comment faire pour le comprendre. S'il vous plaît aider !
J'ai donc ces deux tables:
POSITION
positionid(PK), description
JOB
jobid(PK),positionid(FK),description
Comment puis-je utiliser les requêtes HQL en veille prolongée pour aller chercher de l'ensemble des emplois avec leurs descriptions de poste ?
Edit: Donc, ce que je suis en train de réaliser:
JOBID POSITION.DESCRPTION JOB.DESCRIPTION
1 Teacher Science Teacher
2 Coach Football Coach
et ainsi de suite pour tout le travail est dans le tableau des tâches. Je suis à essayer de comprendre ce que sera HQL pour cela.
J'ai mis en place le code suivant jusqu'à maintenant :
position.hbm.xml
<hibernate-mapping>
<class name="com.XXXX.model.Position" table="POSITION">
<id name="positionID" type="int" column="POSITIONID" >
<generator class="assigned"/>
</id>
<property name="description">
<column name="DESCRIPTION" />
</property>
<set name="jobs">
<key column="positionID" />
<one-to-many class="com.XXXX.model.Job" />
</set>
</class>
</hibernate-mapping>
job.hbm.xml
<hibernate-mapping>
<class name="com.XXXX.model.Job" table="JOB">
<id name="jobID" type="int" column="JOBID" >
<generator class="assigned"/>
</id>
<property name="description">
<column name="DESCRIPTION" />
</property>
<many-to-one name="position" class="com.XXXX.model.Position" column="positionID" />
</class>
</hibernate-mapping>
Position.java
public class Position {
private int positionID;
private String description;
private Set<Job> jobs = new HashSet<Job>();
//Getters and Setters for all the above three follows...
}
Job.java
public class Job {
private int jobID;
private String description;
private Position position;
//Getters and Setters for all the above three follows...
}
Dans mon code j'utilise maintenant
session.createQuery("from Position as p left join p.positionID as pid").list();
Je sais que c'est pas correct et je reçois l'erreur de suivi:
java.lang.NullPointerException
at org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:317)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3268)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3060)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2938)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
.........................
...........................
Quelqu'un peut me dire comment résoudre ce problème s'il vous plaît ?
- Une jointure est utilisé pour naviguer à travers une association entre deux entités. Votre requête n'a pas de sens. Que voulez-vous vraiment atteindre? Vous dites que yuou voulez tous les travaux avec leur description de poste, mais votre montre le code que vous voulez obtenir un
List<Position>
. - Salut, je comprends la confusion, j'ai essayé avec la requête que j'ai cité ci-dessus, même pas sûr que ce soit correct. J'ai maintenant mis à jour la question de ce que je suis vraiment essayer de l'atteindre.
Vous devez vous connecter pour publier un commentaire.
Si vous ne souhaitez que ces trois colonnes, puis le HQL devrait être
Cette requête retourne un
List<Object[]>
et chaque Objet de tableau dans la liste contient ces trois éléments.Il serait beaucoup plus naturel, cependant, pour utiliser cette requête:
qui serait en charge de tous les travaux avec leur position. La requête retourne une Liste, et vous serez en mesure d'accéder à la trois informations uou souhaitez à l'aide de
job.getId()
,job.getPosition().getDescription()
, etjob.getDescription()
.La syntaxe des requêtes HQL est décrite avec des exemples dans le la documentation de référence, un must-read.
Je pense que vous pouvez juste getJobs() à partir de la Position de l'objet