# EJB - CMR in EJBQL



## bronks (30. Mrz 2006)

Hi!

Ich habe mir folgendes ganz einfach gehaltenes Datenmodell ausgedacht (zum vergrößern bitte auf das Bild klicken).





CMR funktioniert und ich kann vom LocalInterface hintraversen wohin ich will. Klappt prima. Jetzt hänge ich wieder beim EJBQL in Sachen drin, die ich mit den mir verfügbaren Dokumenten und auch Google nicht enträtseln kann.

In der Entity zartikel habe ich einen Finder mit folgendem QL angelegt: 

```
SELECT OBJECT(o) 
FROM Zartikel o
where o.sparte.spartetext = 'Farben'
```
Funktioniert wunderbar. Es werden mir alle Artikel angezeigt, welche der Sparte 'Farbe' angehören.

In der Entity Auftragsposition wollte ich das gleiche Spiel mit diesem QL machen. Es sollen alle Auftragspositionen zurückgegeben werden, bei denen der Kunde 'Maier' heißt, aber leider klappt das nicht und wird mit folgender Meldung durch den SJSAS8.2 reklamiert:

```
Bean:   ZauftragpositionBean
Method: java.util.Collection findByKunde()
EJBQL:  SELECT OBJECT(o) 
FROM Zauftragposition o
where o.auftragsnummer.kunde = 'Maier'
Error:  line(3) column(9): JDO75317: Field 'auftragsnummer' of type 'java.lang.Integer' is not a single valued cmr-field.
```

CMR ist richtig eingestellt, da folgender Code funktioniert:

```
ZauftragpositionLocal position = (ZauftragpositionLocal) it.next();
position.getZauftragBean().getKunde();
```

Ich komme nicht dahinter warum der 'findByKunde()' in der Auftragsposition nicht funktioniert und die Meldung vom SJSAS sagt mir leider nicht viel. Was mache ich verkehrt bzw. wie macht man es richtig?

Danke

Bronks


----------



## KSG9|sebastian (30. Mrz 2006)

Ich hab zwar keine ahnung von EJB/QL, aber schau dir mal das an:

http://www.onjava.com/pub/a/onjava/2001/09/19/ejbql.html?page=3

Da steht auch was über die single-valued fields


----------



## KSG9|sebastian (30. Mrz 2006)

ach..

www.theserverside.com gibts "Mastering EJB - Third Edition" als kostenloses eBook, vll. steht da ja was drin.


----------



## bronks (30. Mrz 2006)

@KSG9|sebastian:
Vielen Dank! Beide Dokumente kenne ich schon. Leider sind diese zu oberflächlich und entsprechen 1:1 dem J2eeTut von Sun.

In dem Artikel auf www.onjava.com ist ein schönes Bildchen zum Model. Die QL sind nur so einfach gehalten, wie man selbst auch draufkommen könnte. Interessant wäre ein QL, welches alle Produkte ausgibt, welche an einen bestimmten Ort geliefert wurden (z.B.)

In meinem o.g. Beispiel könnte ich auch auch von der Zauftrag-Entity mit einem Finder auf die Positionen gehen. Das kompliziert die weitere Verarbeitung und ist nicht in jedem Fall optimal anwendbar.


----------



## Bleiglanz (30. Mrz 2006)

```
FROM Zauftragposition o
where o.auftragsnummer.kunde = 'Maier' 

du meinst wohl

FROM Zauftragposition o
where o.zauftragBean.kunde = 'Maier'
```
je nachdem, auftragsnummer kannste nicht nehmen?


----------



## bronks (30. Mrz 2006)

Bleiglanz hat gesagt.:
			
		

> ```
> Du meinst wohl
> 
> FROM Zauftragposition o
> ...


Das habe ich auch schon erfolglos probiert. Wenn das Funktioniert:

```
SELECT OBJECT(o)
FROM Zartikel o
where o.sparte.spartetext = 'Farben'
```
Dann hätte ich gedacht, daß 'where o.auftragsnummer.kunde = 'Maier'' auch funktionieren könnte, weil ich über das Schlüsselfeld gehe.



			
				Bleiglanz hat gesagt.:
			
		

> je nachdem, auftragsnummer kannste nicht nehmen?


In dem Beispiel kann ich über die AuftragsEntity gehen und mir eine Collection mit den Positionen geben lassen. Es gibt aber Fälle, wegen denen ich mich durch mehrere Entities und Collections durchgraben müßte.

Hast Du ne Ahnung was der SJSAS mit "is not a single valued cmr-field" meint und wie man da gegenwirken muß?


----------

