Zapytanie Hql z relacji wiele do wiele

0

Witam,

w jaki sposób napisać odpowiednik zapytania sql:

select u.user_id, u.username, g.group_name  from users u, user_groups ug,
 groups g where u.user_id = ug.user_id and ug.group_id = g.group_id

Wynik:

+---------+----------+------------+
| user_id | username | group_name |
+---------+----------+------------+
| 1 | john | USER |
| 2 | admin | ADMIN |
| 3 | hard | HARDWARE |
| 4 | soft | SOFTWARE |
+---------+----------+------------+

w hql?

Zapytanie:

select u.user_id from Groups g, Users u

Powoduje wyświetlenie każdego user_id * group_name.

Pliki hbm:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Users" table="users">
    <id name="user_id">
        <generator class="identity" />
    </id>
    <property name="username" type="string" />
    <property name="first_name" type="string" />
    <property name="middle_name" type="string" />
    <property name="last_name" type="string" />
    <property name="password" type="string" />
    <set name="groups" table="user_groups" inverse="false" lazy="true" fetch="select" cascade="all" >
        <key>
            <column name="USER_ID" not-null="true" />
        </key>
        <many-to-many entity-name="model.Groups">
            <column name="GROUP_ID" not-null="true" />
        </many-to-many>
    </set>
    <!--one to many users -> incydent -->
    <set name="incydent" table="incydent" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="user_id" not-null="true" />
            </key>
            <one-to-many class="model.Incydent" />
    </set>
    <!--koniec one to many users -> incydent -->
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Groups" table="groups">
  <id name="group_id">
      <column name="GROUP_ID" />
      <generator class="identity" />
  </id>
  <property name="group_name" />
  <property name="group_desc" />
  <set name="users" table="user_groups" inverse="true" lazy="true" fetch="select">
      <key>
          <column name="GROUP_ID" not-null="true" />
      </key>
      <many-to-many entity-name="model.Users">
          <column name="USER_ID" not-null="true" />
      </many-to-many>
  </set>
  </class>
</hibernate-mapping>

Z góry dziękuję za wszelkie wskazówki ;-)

0

select u.user_id from Users u join u.groups g ?

0

Witam,

zapytanie generuje wyjątek:

WARNING: SQL Error: 1146, SQLState: 42S02
2013-11-02 20:29:38 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Table 'u.groups' doesn't exist

Poniżej klasa Users:

public class Users implements java.io.Serializable {
    
    private long user_id;
    .
    .
    .
    
    Set<Groups> groups = new HashSet<Groups>(0);

Zapytanie:

select u.user_id from Users u join groups g

również dubluje dane.

Pozdrawiam i dziękuję

0

SELECT distinct u.user_id FROM Users u JOIN groups g

0

Witam,

użycie

distinct

rozwiązuje problem w tym zapytaniu:

SELECT distinct u.user_id FROM Users u JOIN groups g

Wracając jednak do zapytania sql:

SELECT u.user_id, u.username, g.group_name  FROM users u, user_groups ug,
 groups g WHERE u.user_id = ug.user_id AND ug.group_id = g.group_id

, które wyśwletla dane z dwóch tabel, po próbie przełożenia na hql:

SELECT distinct u.user_id, u.usermane, g.group_name FROM Users u JOIN groups g

Wyświetla ilość wystąpień z klasy Users * wystąpienia z klasy Groups.

Dzięki za pomysły.

ps. wydaje mi się jednak, że

select u.user_id from Users u join u.groups g ?

powinno prawidłowo wyświetlać dane.
Chyba źle jest zmapowana relacja ;-)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1