1

1 つの「役割」を共有する「アクセス」を多数取得したいと考えています。

それは名前付きクエリです:

SELECT access 
FROM Access AS access 
WHERE :role MEMBER OF access.listRole

アクセスエンティティ_

public class Access implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    private String libelle;

    @ManyToOne
    private Module oneModule;
    @ManyToMany
    private List<Role> listRole;
    /* Setter & Getter */
}

Roleエンティティ_

public class Role implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    private String description;
    @Enumerated(EnumType.STRING)
    private Flag oneFlag;
    @Transient
    private int lengthAccess;

    @OneToMany(mappedBy="oneRole")
    private List<UserAccount> listUserAccount;
    @ManyToMany
    private List<Access> listAccess;

    /* Geter & Setter */
}

しかし、正しい EJB-QL を実行することはできません!

構成:

  • EJB3
  • MySQL (InnoDB)
  • jBoss
  • プロップ

ありがとう。

4

2 に答える 2

0

問題を再現できません。指定したJPQLクエリを実行すると、次のようになります。

String qlString = "SELECT access " + 
                    "FROM Access AS access " + 
                   "WHERE :role MEMBER OF access.listRole";

Role role = new Role();
role.setId(1L);

List accesses = session.createQuery(qlString).setParameter("role", role).list();

Hibernateは次のSQLクエリを生成します(いくつかの属性を削除することでエンティティを少し簡略化しました):

select
    access0_.id as id127_,
    access0_.libelle as libelle127_,
    access0_.name as name127_ 
from
    Access access0_ 
where
    ? in (
        select
            role2_.id 
        from
            Access_ROLES listrole1_,
            ROLES role2_ 
        where
            access0_.id=listrole1_.Access_id 
            and listrole1_.listRole_id=role2_.id
    )

すべてが正しいようです(Hibernate Core 3.3.0.SP1、Hibernate Annotations 3.4.0.GA、Hibernate EM 3.4.0.GAでテスト済み)

どのバージョンのHibernate(Core、Annotations、EntityManager)を正確に使用していますか?正確にどのようなエラーが発生しますか?クエリを呼び出す方法を示していただけますか?

于 2010-08-21T23:13:15.697 に答える
0

私の 2 つのクラス間の私のリンク @ManyToMany は正しい方法で書かれていません。プロジェクトの構築中に、MySQL に 2 つのテーブルが作成されました (「アクセス」クラスの私のリンク @ManyToMany の「access_role」、および私のリンクの role_access @ 「ロール」クラスの ManyToMany)

だから、これを修正するために、私はこのように修正しました

public class Access implements Serializable {
    // ...
    @ManyToMany(mappedBy="listAccess")
    private List<Role> listRole;
   // ...
}

public class Role implements Serializable {
    // ...
    @ManyToMany
        @JoinTable(name = "access_role",
            joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "access_id", referencedColumnName = "id"))
    private List<Access> listAccess;
    // ...
}
于 2010-08-23T08:06:43.807 に答える