Hibernate 5.2.17: ORA-01797: за этим оператором должен следовать ЛЮБОЙ или ВСЕ - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть база данных Oracle 18.4.0 XE, к которой я пытаюсь получить доступ из JPA 2.1, реализованной в Hibernate 5.2.17.

У меня есть ManyToMany соединение между двумя объектами:

public class PermissionEntity implements Serializable {
    private static final long serialVersionUID = -3862680194592486778L;

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String permission;

    @ManyToMany
    private List<RoleEntity> roles;
}
public class RoleEntity implements Serializable {
    private static final long serialVersionUID = 8037069621015090165L;

    @Column(unique = true)
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")
    private List<PermissionEntity> permissions;
}

При попытке выполнить JPA-запрос Spring Data в PermissionRepository: findAllByPermission(Iterable<String> permissions), я получаю следующее исключение:

Error : 1797, Position : 140, Sql = select permission0_.id as id1_0_, permission0_.permission as permission2_0_ from PermissionEntity permission0_ where permission0_.permission=(:1  , :2 ), OriginalSql = select permission0_.id as id1_0_, permission0_.permission as permission2_0_ from PermissionEntity permission0_ where permission0_.permission=(? , ?), Error Msg = ORA-01797: this operator must be followed by ANY or ALL

Ответы [ 2 ]

4 голосов
/ 28 апреля 2019

Вы указываете движку Spring Data Jpa для поиска Permission, где разрешение равно списку. Он должен использовать оператор IN , поэтому имя вашего метода должно быть:

findAByPermissionIn(Iterable<String> permissions)
1 голос
/ 28 апреля 2019

Используйте ключевое слово "in": findAllByPermissionIn(Iterable<String> permissions).

Это приведет к следующему запросу: where permission0_.permission IN (:permissions).

...