使用 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.DateString 查询 Parent。理想情况下,它急切地获取了 Set<Child> 加入 someDatesomeKeyField.

我已经达到了它能够很好地获取 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 注释修复了它。