-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Select bei n:m-Beziehung
PostPosted: Sat Dec 27, 2008 1:30 pm 
Beginner
Beginner

Joined: Sat Oct 18, 2008 10:25 am
Posts: 30
Hallo alle zusammen,

ich habe folgende Klassen. Person, Lodger und Category. Lodger ist abgeleitet von Person und Person steht mit Category in einer n:m-Beziehung, d.h. innerhalb von Person gibt es ein Set namens categories. Der Primärschlüssel von Category heißt categoryId.

Ich möchte nun alle Personen ermitteln, bei denen die categoryId = 1 ist.

Folgende zwei Anweisungen habe ich versucht:

1. select p from Person p join p.categories c where c.categoryId = 1

2. select p from Person p, in (p.categories) c where c.categoryId = 1

In beiden Fällen bekomme ich null zurück, obwohl es definitiv einen Datensatz gibt, der passt.

Weiß jemand, was an diesen Anweisungen nicht stimmt?


Top
 Profile  
 
 Post subject: elements(...) vergessen?
PostPosted: Sun Dec 28, 2008 1:46 pm 
Newbie

Joined: Thu Apr 03, 2008 11:14 am
Posts: 10
Hi

Ich glaube, du hast in der 2. HQL-Abfrage die ELEMENTS()-Funktion vergessen und die komplette Syntax falsch!

Kannst du mal die Klasse Person beschreiben (Source posten)?

Mfg

_________________
Matthias Keller
CEO / Lead Software Developer
QueueX Software & Webdesign GbR
mail to mkeller@queuex.de

Hibernate is a solution that grows with an engaged community


Top
 Profile  
 
 Post subject:
PostPosted: Sun Dec 28, 2008 5:24 pm 
Beginner
Beginner

Joined: Sat Oct 18, 2008 10:25 am
Posts: 30
Hallo,

die Syntax dieser beiden Anweisungen habe ich im Internet gefunden für eine ähnliche Situation. Aber auch nach vielem rumdoktorn habe ich es nicht hingekriegt. Wenn die Syntax nicht stimmt, ist das natürlich kein Wunder. Ich bin zur Zeit bei meinen Eltern und mein Hibernate-Buch liegt zu Hause. Deswegen kann ich die Elements-Funktion nicht nachschlagen.

Ich poste mal nur einen Teil von Person, weil sie aus einem ganzen Berg Getter und Setter besteht und ziemlich groß ist. Ich lasse mal alles drin, was für die Beziehungen notwendig ist.

Person enthält eigentlich nur Angaben, welche für eine Person wichtig sind (Adressdaten, usw.), und verschiedene Beziehungen zu anderen Klassen. Eine Person soll nun verschiedenen Kategorien zugeordnet werden können. Und eine Kategorie soll nicht nur eine Person enthalten, sondern mehrere. Die n:m-Beziehung funktioniert auch wunderbar. Personen werden richtig gespeichert und die Kategorien werden in einer Personenliste auch einwandfrei angezeigt.

Code:
package de.waldhausweg7.model;

public class Person extends BeanBase implements Listener{
   private int personId;
   private String firstName;

   /**
    * Die Stadt, in welcher die Person wohnt.
    */
   private City city;
   /**
    * Enthält die Kategorien einer Person.
    */
   private Set<Category> categories = new HashSet<Category>();
   /**
    * Die Konfession der Person.
    */
   private Confession confession;
   /**
    * Das Heimatland der Person.
    */
   private Country country;
   /**
    * Der Diskriminator.
    * p = Person
    * l = Lodger
    */
   private String personType;
   /**
    * Die Mieten der Person.
    */
   private Set<Rent> rents = new HashSet<Rent>();
   

   // Getter und Setter.
   public int getPersonId() {
      return personId;
   }


   public void setPersonId(int personId) {
      this.personId = personId;
   }
}


Hier ist die Mapping-Datei:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" auto-import="true">
   <class name="de.waldhausweg7.model.Person" table="Person">
      <id name="personId" type="int">
         <generator class="increment" />
      </id>
      <discriminator column="personType" type="string" force="true" />
      
      <property name="firstName" column="firstName" />
      <property name="surName" column="surName" />
      <property name="street" column="street" />
      <property name="extraAddressLine" column="extraAddressLine" />
      <property name="phone" column="phone" />
      <property name="mobile" column="mobile" />
      <property name="fax" column="fax" />
      <property name="email" column="email" />
      <property name="comment" column="comment" />
      
      <!-- 1:n-Beziehung zu Ort -->
      <many-to-one name="city" column="cityId" class="de.waldhausweg7.model.City" />
      
      <!-- 1:n-Beziehung zu Konfession -->
      <many-to-one name="confession" column="confessionId" class="de.waldhausweg7.model.Confession" />
      
      <!-- 1:n-Beziehung zu Land -->
      <many-to-one name="country" column="countryId" class="de.waldhausweg7.model.Country" />
      
      <!-- n:m-Beziehung zu Kategorie -->
      <set name="categories" table="person_category" lazy="false">
         <key column="personId" />
         <many-to-many class="de.waldhausweg7.model.Category" column="categoryId" />
      </set>
      
      <!-- 1:n-Beziehung zu Miete -->
      <set name="rents" cascade="none" lazy="true">
         <key column="personId" />
         <one-to-many class="de.waldhausweg7.model.Rent" />
      </set>
      
      <!-- Beziehung zu der Unterklasse Lodger -->
      <subclass name="de.waldhausweg7.model.Lodger" discriminator-value="l">
         <property name="gender" column="gender" />
      </subclass>      
   </class>
</hibernate-mapping>


Und hier die Mapping-Datei zu Category:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false" auto-import="true">
   <class name="de.waldhausweg7.model.Category" table="Category">
      <id name="categoryId" type="int">
         <generator class="increment" />
      </id>
      <property name="categoryName" column="categoryName" />
      <property name="comment" column="comment" />
   </class>   
</hibernate-mapping>


Und die Klasse Category:

Code:
package de.waldhausweg7.model;

import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;

import com.icesoft.faces.component.ext.RowSelectorEvent;

import de.waldhausweg7.listener.BeanBase;
import de.waldhausweg7.listener.Listener;
import de.waldhausweg7.pages.PersonPage;
import de.waldhausweg7.service.CategoryService;
import de.waldhausweg7.utils.JsfUtil;

public class Category extends BeanBase implements Listener {
   private int categoryId;
   private String categoryName;
   private String comment;
   /**
    * Kategorien in einer Liste aus SelectItems.
    */
   //private List<SelectItem> categoryItems;
   
   // Konstruktoren.
   public Category(int categoryId, String categoryName) {
      this.categoryId = categoryId;
      this.categoryName = categoryName;
   }
   
   public Category() {
      
   }
   
   // Getter und Setter.
   public int getCategoryId() {
      return categoryId;
   }
   
   public void setCategoryId(int categoryId) {
      this.categoryId = categoryId;
   }
   
   public String getCategoryName() {
      return categoryName;
   }
   
   public void setCategoryName(String categoryName) {
      this.categoryName = categoryName;
   }
   
   public String getComment() {
      return comment;
   }

   public void setComment(String comment) {
      this.comment = comment;
   }
}

Viele Grüße,

Christopher


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 29, 2008 1:26 pm 
Newbie

Joined: Thu Apr 03, 2008 11:14 am
Posts: 10
Hi

Auch wenn du gerade kein Buch zur Hand hast, kannst du hier bissl was nachlesen...: Abschnitt 11.4

Leider ist nirgends mal konkret ELEMENTS() beschrieben... :-(

Viele Grüße
aus Chemnitz - Stadt der Moderne

_________________
Matthias Keller
CEO / Lead Software Developer
QueueX Software & Webdesign GbR
mail to mkeller@queuex.de

Hibernate is a solution that grows with an engaged community


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 01, 2009 9:31 am 
Beginner
Beginner

Joined: Sat Oct 18, 2008 10:25 am
Posts: 30
Hallo,

danke für deine Antwort. Ich habe jetzt alles mögliche gelesen und ausprobiert, aber leider hat nicts funktioniert. Ich versuche es jetzt mal mit einer SQLQuery.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 09, 2009 12:30 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Hallo

1. select p from Person p join p.categories c where c.categoryId = 1
oder
from Person p where p.categories.categoryId = 1
sollte beides gehen

Kannst Du das SQL-Log aufdrehen und posten was für Queries daraus entstehen?
Die könntest Du nämlich direkt gegen die DB testen, dann wird auch meistens klarer warums nicht geht.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.