[IBATIS/C#] 1 plus N probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
Hallo,

Ik ben bezig met een applicatie die gebruikt maakt van ibatis. Echter ik heb een klein probleem met het ophalen van gegevens.

Wat ik wil? Ik wil met 1 query uit 3 tables data halen. Nu is dat niet het probleem(Denk ik, de query werkt en geeft goede resultaten). De kleine versie van het ERD is:

Kaart --> Tocht --> Post

Waarbij een tocht 1 of meerdere posten bevat. Een kaart heeft ook maar 1 Tocht.
Ik heb de volgende sqlmap gefabriceerd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Tocht" xmlns="http://ibatis.apache.org/mapping">
  <alias>
    <typeAlias alias="Tocht" type="Webtv.BU.Tocht" />
    <typeAlias alias="Post" type="Webtv.BU.Post" />
    <typeAlias alias="Kaart" type="Webtv.BU.Kaart"/>
  </alias>
  <resultMaps>
    <resultMap id="tochtResult" class="Tocht">
      <result column="tocht_id" property="ID"/>
      <result column="tocht_naam" property="Naam"/>
      <result column="tocht_datum" property="Datum"/>
      <result column="tocht_jaar" property="Jaar"/>
      <result column="tocht_prijs" property="Prijs"/>
      <result property="Posten" resultMapping="Tocht.postResult"/>
    </resultMap>
    <resultMap id="postResult" class="Post">
      <result column="post_id" property="ID"/>
      <result column="post_naam" property="Naam"/>
      <result column="post_tocht" property="Tocht"/>
    </resultMap>
    <resultMap id="kaartResult" class="Kaart">
      <result column="kaart_id" property="ID"/>
      <result column="kaart_rfid" property="RFID"/>
      <result property="Tocht" resultMapping="Tocht.tochtResult"/>
      <!-- <result property="Deelnemer" resultMapping="Deelnemer.DeelnemerResult"/> -->
    </resultMap>
  </resultMaps>
  <statements>
    <select id="selectTochten" resultMap="tochtResult">
      SELECT * FROM Tocht T LEFT OUTER JOIN Post P ON P.post_tocht = T.tocht_id
    </select>
    <select id="selectTochtById" parameterClass="int" resultMap="tochtResult">
      SELECT * FROM Tocht T LEFT OUTER JOIN Post P ON P.post_tocht = T.tocht_id WHERE tocht_id = #value#
    </select>
    <select id="selectTochtByNaam" parameterClass="string" resultMap="tochtResult">
      SELECT * FROM Tocht T LEFT OUTER JOIN Post P ON P.post_tocht = T.tocht_id WHERE tocht_naam = #value#
    </select>
    <select id="getPostenByTocht" parameterClass="int" resultMap="postResult">
      SELECT * FROM Post WHERE post_tocht = #value#
    </select>
    <select id="selectKaart" parameterClass="int" resultMap="kaartResult">
      SELECT * FROM Kaart K
      INNER JOIN
        Tocht T
      ON
        T.tocht_id = K.kaart_tocht
      INNER JOIN
        Post P
      ON
        P.post_tocht = T.tocht_id
      WHERE kaart_rfid = #value#
    </select>
  </statements>
</sqlMap>


Nu krijg ik dus mooie resultaten. De kaart krijg ik binnen. De Tocht wordt netjes aan de Kaart gekoppeld. En aan de tocht word 1 Post gekoppeld. Terwijl er meer posten in de DB staan, hier gaat het dus ook fout.

Ik heb al geprobeerd om andere soort joins te gebruiken, tevergeefs. Verder heb ik gekeken op de IBatis boards. Maar hier waren alleen mensen met het n plus 1 probleem. Ik heb een probleem met 1 plus n.

Heeft hier iemand een idee wat het probleem kan zijn waardoor ik maar 1 post in mijn lijst krijg terwijl ik er 6 moet krijgen?

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Ik ken Ibatis niet, maar werkt je query wel als je het rechtstreek op de RDBMS loslaat? Krijg je dan wel alle records die je wilt?

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT * FROM Kaart K 
      INNER JOIN 
        Tocht T 
      ON 
        T.tocht_id = K.kaart_tocht 
      INNER JOIN 
        Post P 
      ON 
        P.post_tocht = T.tocht_id 
      WHERE kaart_rfid = #value# 

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
Dan krijg ik al mijn 6 records te zien. Dus alle posten.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Ik ken ibatis helaas niet, maar zou het hiermee te maken kunnen hebben:

XML:
1
2
3
<select id="getPostenByTocht" parameterClass="int" resultMap="postResult"> 
    SELECT * FROM Post WHERE post_tocht = #value# 
</select> 

Het lijkt er namelijk op, gezien de query, dat je maar een record selecteert op de tabel Post.

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
Die query klopt dat die maar 1 record ophaalt. Het gaat om het selectKaart statement. Deze geeft de foute uitvoer.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Misschien zou je de selectKaart query kunnen herschrijven zodat ie uit Post selecteert, en joint op Tocht en Kaart, ik weet niet of dat verschil maakt maar het is duidelijker aangezien je Posts wilt selecteren (toch?).

Daarnaast zou ik geen * gebruiken, maar dat is bijzaak.

offtopic:
had ik al gezegd dat ik Ibatis niet ken?

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
Helaas is dat niet mogelijk door het model dat is gemaakt. Dit is een model waar we inmiddels niet meer van kunnen afwijken.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Dat snap ik niet, je kan toch de volgende query gebruiken (wat heeft dat verder met je model te maken)?
SQL:
1
2
3
4
5
6
7
8
9
SELECT * FROM Post P  
  inner join 
    Toch T
  on
     p.post_tocht=t.tocht_id
  inner join 
     Kaart K
  on
     T.tocht_id=K.kaart_tocht

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
Je query klopt. Maar doordat ibatis objecten mapt naar objecten in mijn programma kan dit niet. Deze objecten kennen elkaar niet in een andere richting dan de huidige.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:31

pistole

Frutter

Okee dan kan ik je helaas niet verder helpen, en gezien de weinige response alhier zijn er blijkbaar weinig mede-tweakers met Ibatis kennis :p

Heb je het probleem al bij (fora van) de leverancier aanhangig gemaakt?

Ik frut, dus ik epibreer

Pagina: 1