JPQL:EclipseLink 和 Hibernate 的区别
JPQL: Difference between EclipseLink and Hibernate
我已经 asked 了解我的情况,但没有找到合适的解决方案。经过一些额外的搜索,我想我知道问题的根源,尽管不知道如何解决。如前所述,我有:
@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")
目的是全部设置parents。当我编译它时,Hibernate 抱怨 left and right hand sides of a binary logic operator were incompatible [integer : component[node,parent]]
由于该语句在 EclipseLink 中有效,我不知道如何将其更改为有效的 Hibernate 语句。将不胜感激。
经过一番努力,我终于找到了这个问题的根本原因。我知道 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 可以获取所需的信息。尽管如此,通过这个额外的注释,代码仍然有效!
我已经 asked 了解我的情况,但没有找到合适的解决方案。经过一些额外的搜索,我想我知道问题的根源,尽管不知道如何解决。如前所述,我有:
@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")
目的是全部设置parents。当我编译它时,Hibernate 抱怨 left and right hand sides of a binary logic operator were incompatible [integer : component[node,parent]]
由于该语句在 EclipseLink 中有效,我不知道如何将其更改为有效的 Hibernate 语句。将不胜感激。
经过一番努力,我终于找到了这个问题的根本原因。我知道 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 可以获取所需的信息。尽管如此,通过这个额外的注释,代码仍然有效!