2014-09-10 2 views
0

У меня есть два объекта с отношением ManyToMany.HQL Параметр не в атрибуте

Роль Core:

@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; 
} 

Right Core:

@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; 
} 

Теперь я хочу, чтобы каждый RightCore, что не установлен для одного RoleCore. Для этого я попробовал следующие два заявления и оба бросают 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); 
} 

EDIT: Как назвать методы:

@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

Второй запрос, где сравнение предложений не выглядит правильным, необходимо сравнить на уровне поля. – Rudra

+0

сравнить на уровне поля? не могли бы вы сказать мне, как изменить его так, чтобы он работал? – Sarajog

+0

как в первом запросе: r.roles. – Rudra

ответ

0

Иногда решение проблемы действительно Simpel. Мне нужно было добавить элементы перед списком:

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

idHope я правильно понял ваш вопрос, и я думаю, что вы ищете что-то вроде:

Чтобы получить все RightCores, не установлены для по крайней мере одного RoleCore (средства найти все rightcores, чьи роли в пусто) для этого вам нужно иметь запрос, как показано ниже:

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

Edit:

нормально, прочитав ваш комментарий, вы должны иметь запрос, аналогичный:

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) 
+0

Sry, я думаю, вы меня неправильно поняли, мне нужен список всех прав, которые могут быть добавлены к определенной роли. Чтобы их можно было добавить, они не должны добавляться уже к этой роли. Если я делаю это с кодом java, он выглядит так: Список allRights = rightCoreDao.findAll(); Список прав = новый ArrayList <>(); для (RightCore правый: всеRights) { если (! Роль.getRights() содержит (справа)) { прав.адд (справа); } } права на возврат; – Sarajog

+0

попробовал то, что вы предложили: org.hibernate.QueryException: незаконная попытка разыменования коллекции [rolecore1_.role_id.rights] с ссылкой на свойство свойства [id] – Sarajog

+0

Хорошо, просто дал вам схему запроса, посмотрите на мое edit2. вы получили ошибку из-за 'ro.rights.id' – user3487063

Смежные вопросы