英文:
JPQL: Difference between EclipseLink and Hibernate
问题
我已经询问过关于我的情况,但没有找到合适的解决方案。经过进一步的搜索,我认为我知道问题的根源,尽管不知道如何解决。如前所述,我有:
@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抱怨左右操作数不兼容的二元逻辑运算符 [integer : component[node,parent]]
由于该语句在EclipseLink中有效,我不知道如何将其改为适用于Hibernate的工作语句。非常感谢您的帮助。
英文:
I already asked about my situation and didn't find a proper solution. After some additional search I think I know the source problem although don't know how to resolve it. As mentioned I have:
@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;
}
and I have
@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;
...
Up to this point I think nothing special. I have the query:
@NamedQuery(name = "Role.findParents", query =
"SELECT r FROM Role r JOIN RoleAssociation ra ON r.id = ra.parent.id WHERE ra.node.id = :id")
with the purpose to all set parents. When I compile it Hibernate complains left and right hand sides of a binary logic operator were incompatible [integer : component[node,parent]]
Since the statement works in EclipseLink I have no clue how to change it into a working Hibernate one. Help would be highly appreciated.
答案1
得分: 1
在一些挣扎后,我终于找到了这个问题的根本原因。我知道SQL可能需要改进,但我在其他类似的地方也失败了。
Hibernate要求在@OneToMany
关系中要有匹配的一对。
在我的查询中,我引用了角色的“parent”。解决方案是
@Data
public class RoleAssociation implements Serializable {
@Id
@JoinColumn(name = "has_parent_role_id")
@ManyToOne // <<<<<<==== Hibernate需要的
private Role node;
@Id
@JoinColumn(name = "is_parent_for_role_id")
@ManyToOne // <<<<<<==== Hibernate需要的
private Role parent;
我不知道为什么Hibernate会抱怨,而EclipseLink可以获取所需的信息。不过,通过这个额外的注解,代码可以正常工作!
英文:
After some struggels I finally figured the root cause of this problem. I'm aware that the SQL might be improved nevertheless I fail at other similar spots.
Hibernate requires to have a matching pair for @OneToMany
relation.
In my query I refer to the parent
of my role. The solution is
@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;
I have no clue why Hibernate complains while EclipseLink can fetch the required information. Nevertheless with this additional annoation the code works!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论