JPQL: разница между EclipseLink и Hibernate - PullRequest
0 голосов
/ 30 января 2020

Я уже спросил о моей ситуации и не нашел правильного решения. После некоторого дополнительного поиска я думаю, что знаю проблему с источником, но не знаю, как ее решить. Как уже упоминалось, у меня есть:

@Table(name = "role__parent")
@IdClass(RoleAssociationKey.class)
@Data
public class RoleAssociation implements Serializable {

    @Id
    @JoinColumn(name = "has_parent_role_id")
    private Role node;

    @Id
    @JoinColumn(name = "is_parent_for_role_id")
    private Role parent;
    ...
}
@Data
class RoleAssociationKey implements Serializable {
    private static final long serialVersionUID = 1L;
    private int node;
    private int parent;
}

, и у меня есть

@Table(name = "role")
@Data
public class Role implements IRole {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToMany(mappedBy = "node", orphanRemoval = true, cascade = { CascadeType.ALL })
    private List<RoleAssociation> parentRoles;
    ...

До этого момента я не думал ничего особенного. У меня есть запрос:

@NamedQuery(name = "Role.findParents", query = 
   "SELECT r FROM Role r JOIN RoleAssociation ra ON r.id = ra.parent.id WHERE ra.node.id = :id")

с целью всех установленных родителей. Когда я его компилирую, Hibernate жалуется left and right hand sides of a binary logic operator were incompatible [integer : component[node,parent]]

Поскольку оператор работает в EclipseLink, я понятия не имею, как его преобразовать в рабочий Hibernate. Помощь будет высоко ценится.

1 Ответ

1 голос
/ 03 февраля 2020

После нескольких схваток я наконец выяснил причину root этой проблемы. Я знаю, что SQL мог бы быть улучшен, однако я терплю неудачу в других подобных местах.

Hibernate требует наличия подходящей пары для отношения @OneToMany.

В моем запросе я ссылаюсь на parent моей роли. Решение:

@Data
public class RoleAssociation implements Serializable {

    @Id
    @JoinColumn(name = "has_parent_role_id")
    @ManyToOne // <<<<==== rerequired for Hibernate
    private Role node;

    @Id
    @JoinColumn(name = "is_parent_for_role_id")
    @ManyToOne // <<<<==== rerequired for Hibernate
    private Role parent;

Понятия не имею, почему Hibernate жалуется, а EclipseLink может получить необходимую информацию. Тем не менее, с этой дополнительной аннотацией код работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...