HQL参数不在属性中

时间:2014-09-10 13:59:54

标签: java select hql

我有两个ManyToMany关系的实体。

角色核心:

@Entity
@Table(name = "ROLE")
public class RoleCore extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "role_seq_gen")
    @SequenceGenerator(name = "role_seq_gen", sequenceName = "ROLE_SEQ", initialValue = 100, allocationSize = 1)
    @Column(name = "ROLE_ID", nullable = false)
    private Long id;

    @Column(name = "NAME", length = 255)
    private String name;

    @Column(name = "IS_ADMIN")
    private Short isAdmin;

    @ManyToMany
    @JoinTable(inverseJoinColumns = @JoinColumn(name = "FK_RIGHT", referencedColumnName = "RIGHT_ID"),
            joinColumns = @JoinColumn(name = "FK_ROLE", referencedColumnName = "ROLE_ID"))
    private List<RightCore> rights;
}

正确的核心:

@Entity
@Table(name = "RIGHT")
public class RightCore extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "right_seq_gen")
    @SequenceGenerator(name = "right_seq_gen", sequenceName = "RIGHT_SEQ", initialValue = 100, allocationSize = 1)
    @Column(name = "RIGHT_ID", nullable = false)
    private Long id;

    @Column(name = "TOKEN", length = 255)
    private String token;

    @Column(name = "NAME_D", length = 255)
    private String nameD;

    @Column(name = "NAME_F", length = 255)
    private String nameF;

    @Column(name = "NAME_I", length = 255)
    private String nameI;

    @Column(name = "IS_ADMIN")
    private Short isAdmin;

    @ManyToMany(mappedBy = "rights")
    private Collection<RoleCore> roles;
}

现在我想获得一个没有为一个RoleCore设置的RightCore。为此,我尝试了以下两个语句,并抛出java.sql.SQLSyntaxErrorException:"ORA-00936: missing expression"

public interface RightCoreDAO extends JpaRepository<RightCore, Long> {

    @Query("select r from RightCore r where :role not in (r.roles)")
    List<RightCore> findByRoleNotInAndCategory(
            @Param("role") RoleCore role);

    @Query("select r from RightCore r where r not in (:rights)")
    List<RightCore> findByRightsNotInAndCategory(
            @Param("rights") List<RightCore> role);
}

编辑: 我怎么称呼这些方法:

    @Service   
    @Transactional  
    public class AuthorizationDataService {

    @Autowired
    RightCoreDAO rightCoreDao;

    public List<RightCore> loadAvailableRights1(RoleCore role) {
        return rightCoreDao.findByRoleNotInAndCategory(role);
    }

    public List<RightCore> loadAvailableRights2(RoleCore role) {
        return rightCoreDao.findByRightsNotInAndCategory(role.getRights());
    }
}

我到底做错了什么?如何使其中一个陈述有效?

Sarajog

2 个答案:

答案 0 :(得分:0)

idHope我正确地理解了你的问题,我认为你正在寻找类似的东西:

获取所有未设置至少单个RoleCore的RightCore(意味着找到角色为空的所有权利)  为此你需要有如下的查询:

select r from RightCore r where r.roles IS EMPTY;

修改

好的,在阅读你的评论之后你应该有类似的查询:

select rc from rightcore rc where rc.id not in ( select ro.rights.id from rolecore ro where ro.id=:role_id )

<强> EDIT2:

select ri from rights ri where ri.id not in( select rs.id from roles ro join ro.rights rs where ro.id=:role_id )

答案 1 :(得分:0)

有时问题的解决方案真的很简单。我只需要在列表前添加元素:

@Query("select r from RightCore r where :role not in elements(r.roles)")
List<RightCore> findByRoleNotInAndCategory(
        @Param("role") RoleCore role);