我有两个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
答案 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);