JPQLで1対多の関係をクエリする方法は?

huahsin68

ロールエンティティと1対多の関係を持つユーザーエンティティがあります。つまり、1人のユーザーが複数の役割を持つことができます。とにかく、JPQLを使用してクエリを実行すると、Roleエンティティに重複した結果が表示されますROLE_ADMINこの場合、2回表示されます。コードをデバッグすると、Roleエンティティが同じメモリIDを持っていることがわかります。

[org.huahsin.Role@1b332d22, org.huahsin.Role@1b332d22]

JPQLで何か間違ったことをしたかどうかはわかりませんでした。私が間違っている場合は私を訂正してください。以下は、この問題に関するいくつかのヒントです。


これは、Usersテーブルで利用可能なコンテンツです。

+----------+----------+---------+
| username | password | enabled |
+----------+----------+---------+
| user7    | user7    |       1 |
+----------+----------+---------+

これは、Usersテーブルのテーブルの説明です。

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO   | PRI |         |       |
| password | varchar(32) | YES  |     | NULL    |       |
| enabled  | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

これは、権限テーブルで使用可能なコンテンツです。

+----------+------------+
| username | authority  |
+----------+------------+
| user7    | ROLE_ADMIN |
| user7    | ROLE_USER  |
+----------+------------+

これは、権限テーブルのテーブルの説明です。

+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| username  | varchar(10) | NO   | MUL | NULL    |       |
| authority | varchar(10) | NO   |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

これは、ユーザーエンティティに対するクエリです。

@NamedQuery(
        name="findByUser",
        query="select u from User u where u.username in (select r.userId from u.roleList r where r.userId = :username)")
@Entity
@Table(name="users")
public class User {

    @Id
    private String username;

    private String password;

    private Integer enabled;

    @OneToMany(targetEntity = Role.class, cascade = {CascadeType.ALL})
    @JoinColumn(name="username")
    private List<Role> roleList;

これはロールエンティティです。

@Entity
@Table(name="authority")
public class Role {

    @Id
    @Column(name="username")
    private String userId;

    @Column(name="authority")
    private String role;

これが私が結果を取得する方法です:

List<User> l = emf.createEntityManager().createNamedQuery("findByUser", User.class).setParameter("username", username).getResultList();
for( User u : l ) {
    System.out.println(u.getUsername());
    System.out.println(u.getRoleList());
}
axtavt
  • このクエリで何を達成しようとしているのかは明確ではありません。あなたはそのことで、ユーザーをロードする場合username、およびusername主キーで次のように、あなたはそれを行うことができます。

    User u = em.find(User.class, username);
    
  • Roleエンティティが正しくマップされていないため、誤った結果が得られますuserIdはとして注釈が付けられて@Idいますが、主キーではありません(つまり、一意ではありません)。

データベーススキーマを変更することをお勧めします。UserRole(結合テーブルを使用)の間の多対多の関係はマップするのがはるかに簡単です。

public class User {
    ...
    @OneToMany
    @JoinTable(name = "users_authority")
    private List<Role> roleList;
    ...
}

public class Role {
    @Id 
    private String authority;
}

現在のデータベーススキーマが修正されている場合は、次のことを行う必要があります。

  • authority複合キー(usernameauthorityあるという事実をを使用し表現します@EmbeddedId
  • あなたの関係を双方向にする
  • @MapsId外部キーauthorityusername)がの複合キーの一部であるという事実を示すために使用しますauthority

参照:

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Slick 3.0.0:1対多/多対多の関係をクエリする方法

分類Dev

C#linqで1対多の関係クエリを作成する方法

分類Dev

多対1の関係でLinqクエリを単純化する方法はありますか?

分類Dev

多対1の関係に対するDjangoクエリ、多対1の関係でデータを取得する方法

分類Dev

iosは1つのクエリを多対多の関係で解析します

分類Dev

EloquentORMの多対多の関係をクエリする方法

分類Dev

Laravelで逆多対多関係をクエリする方法

分類Dev

Knex.jsとの多対多の関係をクエリする方法は?

分類Dev

SqlAlchemyとFlask、多対多の関係をクエリする方法

分類Dev

Laravel 5で1対多の関係で1つの外部行のみをクエリする方法

分類Dev

linq c# で多対多の関係をクエリする

分類Dev

多対多の関係を持つJPQLクエリ

分類Dev

1対多の関係SQLAlchemyをクエリする

分類Dev

Postgres クエリで複数の 1 対多の関係を管理する

分類Dev

テーブル間の1対多の関係で行を除外する方法(SQLクエリ)

分類Dev

暗号クエリ言語を使用してneo4jで1対多の関係を作成する方法

分類Dev

JPQLは多対多の関係をチェックします

分類Dev

efcoreで1対多の関係を設計する方法は?

分類Dev

1対多の関係に対するMYSQLクエリ

分類Dev

Hibernateの1対多の関係に関するクエリ

分類Dev

SpringJPAの1対多の関係に関するhqlselectクエリ

分類Dev

TypeORMを使用して多対多の関係をクエリする方法

分類Dev

Entity Framework を使用して多対多の関係をクエリする方法

分類Dev

JPAとJPQLクエリの1対多の関係を組み合わせたクエリの作成

分類Dev

Oracleで多対多の関係クエリを取得するにはどうすればよいですか?

分類Dev

多対多の関係をクエリするDjango

分類Dev

1つのクエリルームで多対多の関係でジャンクションテーブルの追加の列を取得する方法android

分類Dev

1対多の関係に関与するエンティティでSaveChangesを呼び出す方法は?

分類Dev

1対多の関係のチェーンでdjangoにselectクエリを書く方法は?

Related 関連記事

  1. 1

    Slick 3.0.0:1対多/多対多の関係をクエリする方法

  2. 2

    C#linqで1対多の関係クエリを作成する方法

  3. 3

    多対1の関係でLinqクエリを単純化する方法はありますか?

  4. 4

    多対1の関係に対するDjangoクエリ、多対1の関係でデータを取得する方法

  5. 5

    iosは1つのクエリを多対多の関係で解析します

  6. 6

    EloquentORMの多対多の関係をクエリする方法

  7. 7

    Laravelで逆多対多関係をクエリする方法

  8. 8

    Knex.jsとの多対多の関係をクエリする方法は?

  9. 9

    SqlAlchemyとFlask、多対多の関係をクエリする方法

  10. 10

    Laravel 5で1対多の関係で1つの外部行のみをクエリする方法

  11. 11

    linq c# で多対多の関係をクエリする

  12. 12

    多対多の関係を持つJPQLクエリ

  13. 13

    1対多の関係SQLAlchemyをクエリする

  14. 14

    Postgres クエリで複数の 1 対多の関係を管理する

  15. 15

    テーブル間の1対多の関係で行を除外する方法(SQLクエリ)

  16. 16

    暗号クエリ言語を使用してneo4jで1対多の関係を作成する方法

  17. 17

    JPQLは多対多の関係をチェックします

  18. 18

    efcoreで1対多の関係を設計する方法は?

  19. 19

    1対多の関係に対するMYSQLクエリ

  20. 20

    Hibernateの1対多の関係に関するクエリ

  21. 21

    SpringJPAの1対多の関係に関するhqlselectクエリ

  22. 22

    TypeORMを使用して多対多の関係をクエリする方法

  23. 23

    Entity Framework を使用して多対多の関係をクエリする方法

  24. 24

    JPAとJPQLクエリの1対多の関係を組み合わせたクエリの作成

  25. 25

    Oracleで多対多の関係クエリを取得するにはどうすればよいですか?

  26. 26

    多対多の関係をクエリするDjango

  27. 27

    1つのクエリルームで多対多の関係でジャンクションテーブルの追加の列を取得する方法android

  28. 28

    1対多の関係に関与するエンティティでSaveChangesを呼び出す方法は?

  29. 29

    1対多の関係のチェーンでdjangoにselectクエリを書く方法は?

ホットタグ

アーカイブ