Java HQL参数不在属性中

Java HQL参数不在属性中,java,select,hql,Java,Select,Hql,我有两个实体,它们之间有很多关系 角色核心: @Entity @Table(name = "ROLE") public class RoleCore extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "role_seq_gen") @SequenceGenerator(name = "role_seq_gen", sequenceName = "ROL

我有两个实体,它们之间有很多关系

角色核心:

@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;
}
编辑: 我如何调用这些方法:

    @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

我希望我正确理解了你的问题,我认为你在寻找类似于:

要获取至少未为单个角色核心设置的所有RightCore,意味着查找角色为空的所有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 )
编辑2:


有时候,问题的解决方法其实很简单。我只需在列表之前添加元素:

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

第二个查询,其中子句比较看起来不正确,需要在字段级别进行比较。是否在字段级别进行比较?您能告诉我如何更改它以使其工作吗?就像在第一个查询中:r.roles。我不能这样做,因为给定的列表是一个参数,而第一个查询不工作,所以这应该如何帮助?我将向您展示在第二种情况下如何调用该方法,您应该理解;使用属性级别无法实现您的结果。如下所示:@Queryselect t from{entityName}t其中t.attribute=?1列出findAllByAttributeString属性;Sry,我想你误解我了,我需要一份可以添加到某个角色的所有权利的列表。如果可以添加,则不能将其添加到此角色。如果我使用java代码,它看起来是这样的:List allRights=rightCoreDao.findAll;列表权限=新建ArrayList;对于RightCore权限:allRights{if!role.getRights.ContainsRights{rights.AddRights;}}}返回权限;尝试了您的建议:org.hibernate.QueryException:非法尝试使用元素属性引用[id]取消对集合[rolecore1.role\u id.rights]的引用。好的,刚刚给了您一个查询的大纲,请看我的edit2。由于ro.rights.idsry,您出现了错误,该语句也无法运行,但我现在需要休息一下,谢谢您的帮助
select rc from rightcore rc where rc.id not in ( select ro.rights.id from rolecore ro where ro.id=:role_id )
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 )
@Query("select r from RightCore r where :role not in elements(r.roles)")
List<RightCore> findByRoleNotInAndCategory(
        @Param("role") RoleCore role);