使用 JPA 在 Hibernate 中加入复合键
Composite key join in Hibernate with JPA
我在尝试解决这个问题时遇到了一些麻烦,但在 Java 和 Google.
中都解决了这个问题
我有两个 table 想加入。它们都有复合主键,child table 在 parent 的 PK 中有相同的列,外加两个额外的列。在 Java 中,类 大致如下(忽略 getters/setters 等):
@Embeddable
public class ParentKey {
private Date someDate;
private String someKeyField;
}
@Embeddable
public class ChildKey {
private Date someDate;
private String someKeyField;
private String anotherKeyField;
}
我正在尝试根据 java.util.Date
和 String
查询 Parent。理想情况下,它急切地获取了 Set<Child>
加入 someDate
和 someKeyField
.
我已经达到了它能够很好地获取 parent 数据的地步,但是当获取 children 时它会用 ORA-01858: a non-numeric character was found where a numeric was expected
轰炸。我认为它与 java.util.Date
字段有 某些东西,但我不太确定是什么。
两个实体 类 看起来像这样:
@Entity
public class Parent {
@EmbeddedId
private ParentKey key;
@OneToMany(fetch = EAGER, mappedBy = "parent")
private Set<Child> children;
private String someData;
// more data
}
@Entity
public class Child {
@EmbeddedId
private ChildKey key;
@ManyToOne
@JoinColumn({
@JoinColumn(name = "SOME_DATE", insertable = false, updatable = false),
@JoinColumn(name = "SOME_KEY_FIELD", insertable = false, updatable = false),
})
private Parent parent;
private String someChildData;
// more data
}
parent 和 child table 都有 "SOME_DATE"(日期类型)和 "SOME_KEY_FIELD"(vachar2 类型)列。当我打印查询时,我可以看到 Hibernate 正在尝试第二个查询,因此它找到了一些 parents 并试图寻找 children.
我可能在上面做了一些错误的事情,但我无法想象我所做的任何事情会导致 ORA-01858
。即使我删除了所有附加字段并完全坚持关键字段,我也会得到同样的错误,所以我觉得 Hibernate 做了一些意想不到的事情,我只是不知道是什么。
是否有更好的方法来进行此类加入或组织我的 @EmbeddedIds
?我在做什么有什么明显的错误吗?
编辑:我已经打印出 children 查询的绑定变量,但它的绑定顺序错误。我认为如果有一种方法可以指定 parent 中的字段以及它们绑定到哪一列,这将得到解决。
在查看显示绑定变量的 Hibernate 调试后,很明显它没有在子查询(Hibernate 生成)中绑定正确的参数。好像有点随意。
不过,将 referencedColumnNames
添加到 @JoinColumn
注释修复了它。
我在尝试解决这个问题时遇到了一些麻烦,但在 Java 和 Google.
中都解决了这个问题我有两个 table 想加入。它们都有复合主键,child table 在 parent 的 PK 中有相同的列,外加两个额外的列。在 Java 中,类 大致如下(忽略 getters/setters 等):
@Embeddable
public class ParentKey {
private Date someDate;
private String someKeyField;
}
@Embeddable
public class ChildKey {
private Date someDate;
private String someKeyField;
private String anotherKeyField;
}
我正在尝试根据 java.util.Date
和 String
查询 Parent。理想情况下,它急切地获取了 Set<Child>
加入 someDate
和 someKeyField
.
我已经达到了它能够很好地获取 parent 数据的地步,但是当获取 children 时它会用 ORA-01858: a non-numeric character was found where a numeric was expected
轰炸。我认为它与 java.util.Date
字段有 某些东西,但我不太确定是什么。
两个实体 类 看起来像这样:
@Entity
public class Parent {
@EmbeddedId
private ParentKey key;
@OneToMany(fetch = EAGER, mappedBy = "parent")
private Set<Child> children;
private String someData;
// more data
}
@Entity
public class Child {
@EmbeddedId
private ChildKey key;
@ManyToOne
@JoinColumn({
@JoinColumn(name = "SOME_DATE", insertable = false, updatable = false),
@JoinColumn(name = "SOME_KEY_FIELD", insertable = false, updatable = false),
})
private Parent parent;
private String someChildData;
// more data
}
parent 和 child table 都有 "SOME_DATE"(日期类型)和 "SOME_KEY_FIELD"(vachar2 类型)列。当我打印查询时,我可以看到 Hibernate 正在尝试第二个查询,因此它找到了一些 parents 并试图寻找 children.
我可能在上面做了一些错误的事情,但我无法想象我所做的任何事情会导致 ORA-01858
。即使我删除了所有附加字段并完全坚持关键字段,我也会得到同样的错误,所以我觉得 Hibernate 做了一些意想不到的事情,我只是不知道是什么。
是否有更好的方法来进行此类加入或组织我的 @EmbeddedIds
?我在做什么有什么明显的错误吗?
编辑:我已经打印出 children 查询的绑定变量,但它的绑定顺序错误。我认为如果有一种方法可以指定 parent 中的字段以及它们绑定到哪一列,这将得到解决。
在查看显示绑定变量的 Hibernate 调试后,很明显它没有在子查询(Hibernate 生成)中绑定正确的参数。好像有点随意。
不过,将 referencedColumnNames
添加到 @JoinColumn
注释修复了它。