[JAVA] Hibernate select query middels een composite-id?

Pagina: 1
Acties:

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 09-04 11:42
Wat ik nodig heb is een lijst van usergroupid's die bij een bepaalde user horen.
Hiervoor heb ik twee tabellen: UserOfGroup en CatalogUser
In CatalogUser staan de users met login gegevens, in UserOfGroup welke usergroup bij welke user hoort.
Er is nog een UserGroup tabel die enkel de verschillende usergroepen bevat.

De xml ziet er als volgt uit:

UserOfGroup
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="com.jcatalog.commons.hibernate.mapping.UserOfGroup" table="UserOfGroup">
    
        <composite-id name="id" class="com.jcatalog.commons.hibernate.mapping.UserOfGroupCID">
            <key-many-to-one column="LoginName" name="catalogUser" class="com.jcatalog.commons.hibernate.mapping.CatalogUser"/>
            <key-many-to-one column="UserGroupID" name="userGroup" class="com.jcatalog.commons.hibernate.mapping.UserGroup"/>
        </composite-id>
        
        <property column="CreatedBy" length="60" name="createdBy" type="java.lang.String"/>
        <property column="CreatedOn" length="23" name="createdOn" type="java.util.Date"/>
        <property column="ChangedBy" length="60" name="changedBy" type="java.lang.String"/>
        <property column="ChangedOn" length="23" name="changedOn" type="java.util.Date"/>
                        
    </class>
</hibernate-mapping>


CatalogUser
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
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="com.jcatalog.commons.hibernate.mapping.CatalogUser"
        table="CatalogUser"
        polymorphism="implicit"
        dynamic-update="false"
        dynamic-insert="false"
        mutable="true"
    >

        <id
            name="loginName"
            column="LoginName"
            type="string"
            unsaved-value="null"
        >
            <generator class="assigned">
            </generator>
        </id>
    </class>
</hibernate-mapping>

Deze bevat veel meer mappings maar die laat ik vanwege de overzichtelijkheid even weg

Nu is er aan de UserOfGroup een composite id class gekoppeld.
Java:
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
package com.jcatalog.commons.hibernate.mapping;

import java.util.Date;
import org.apache.commons.lang.builder.*;

public class UserOfGroup
{

    public UserOfGroup()
    {
    }

    public UserOfGroup(UserOfGroupCID id)
    {
        this.id = id;
    }

    public UserOfGroup(UserOfGroupCID id, String createdBy, Date createdOn, String changedBy, Date changedOn)
    {
        this.id = id;
        this.createdBy = createdBy;
        this.createdOn = createdOn;
        this.changedBy = changedBy;
        this.changedOn = changedOn;
    }

    public UserOfGroupCID getId()
    {
        return id;
    }

    public void setId(UserOfGroupCID id)
    {
        this.id = id;
    }

        /* stuk weg geknipt */

    private UserOfGroupCID id;
    private String createdBy;
    private Date createdOn;
    private String changedBy;
    private Date changedOn;
}


In gewoon sql ziet het er als volgt uit:

select usergroupid from userofgroup where loginname = 'guest'

In HQL had ik hieraan gedacht:

Criteria criteria = session.createCriteria(UserOfGroup.class);
criteria.add(Expression.eq("id.catalogUser.loginName", "guest") );
rs = criteria.list();

of dit:

String query = "select UserOfGroup from UserOfGroup uog where uog.id.userGroup.catalogUser.loginName = '"+loginn+"' ";
Query q = session.createQuery(query);
rs = q.list();

Hierbij heb ik al vanallerlei varianten geprobeerd maar ik krijg geen resultaat.
De queries worden zonder foutmelding uitgevoerd maar het List object blijft leeg.
De gewone SQL query werkt wel en geeft het juiste resultaat.

Een select direct op de login naam is niet mogelijk bij het UserOfGroup object aangezien er geen getLoginName() methode bestaat.

Ergens heb ik het idee dat ik iets vergeet maar wat?

[ Voor 12% gewijzigd door rvrbtcpt op 27-02-2006 14:48 ]


  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:35

momania

iPhone 30! Bam!

Ik weet dat Hibernate nogal problemen heeft met het querien op composite ids.

Lukt het ook niet zo :?
Java:
1
2
3
4
5
Criteria criteria = session.createCriteria(UserOfGroup.class);
Criteria idCriteria = criteria.createCriteria("id");
Criteria userCriteria = idCriteria.createCriteria("catalogUser");
userCriteria.add(Restrictions.eq("loginName", "guest") ); // ik gebruik altijd Restrictions.. ?
rs = criteria.list();


Maar is het hiet niet makkelijker om op CatalogUser te zoeken?
Waarom via de UserOfGroup :?

Als je alleen alle users wilt die ingedeeld zijn in een groep kan je ook het volgende doen:
Java:
1
2
3
Criteria criteria = session.createCriteria(CatalogUser.class);
criteria.add(Restrictions.isNull("userOfGroupSet"); // of hoe die set ook heet ;)
rs = criteria.list();

Neem je whisky mee, is het te weinig... *zucht*


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 09-04 11:42
Je gebruikt: org.hibernate.criterion.Restrictions

Deze zit niet in Hibernate 2 ?

Jammer genoeg kan ik niet zomaar even versie 3 erin zetten.

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 03-04 10:15
Waarom gebruik je een UserOfGroup klasse en mapping? Dit is volgens mij enkel iets wat betekenis heeft op je db structuur (een koppeltabel), maar in je object graaf zou dit niet aanwezig moeten zijn. Je kan dit oplossen met een many-to-many relatie in hiberate aan te maken.

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 09-04 11:42
Het is inderdaad een koppeltabel.

Probleem is dat ik de structuur en mapping niet zelf gemaakt heb en die ook niet kan aanpassen.

  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:35

momania

iPhone 30! Bam!

Frijns.Net schreef op maandag 27 februari 2006 @ 15:49:
Je gebruikt: org.hibernate.criterion.Restrictions

Deze zit niet in Hibernate 2 ?

Jammer genoeg kan ik niet zomaar even versie 3 erin zetten.
Ah, ok.. je gebruikt nog versie 2.. Dan zou ik helemaal niet beginnen aan Criteria queries, want dat is pas vanaf versie 3 redelijk goed geimplementeerd (voor zover ik weet).

Neem je whisky mee, is het te weinig... *zucht*


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 09-04 11:42
Dju. Dan maar wat anders verzinnen.
Pagina: 1