EJB-QL 3中的成员不起作用

时间:2010-08-19 13:01:41

标签: java jpa jboss jpql

我想检索许多共同具有“角色”的“访问”。

这是命名查询:

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 */
}

角色实体

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!

配置:

  • EJB 3
  • MySQL(InnoDB)
  • jBoss
  • Plop

感谢。

2 个答案:

答案 0 :(得分: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)?你到底有什么错误?你能说明你如何调用查询吗?

答案 1 :(得分:0)

我的两个类之间的链接@ManyToMany没有以正确的方式编写,在项目构建期间,2个表在MySQL中创建(“access_role”用于我的链接@ManyToMany在'access'类中,而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;
    // ...
}