JPA @JoinColumn 自定义对象类型

Posted

技术标签:

【中文标题】JPA @JoinColumn 自定义对象类型【英文标题】:JPA @JoinColumn custom object type 【发布时间】:2019-05-29 13:10:54 【问题描述】:

我正在研究一个使用 JPA 的项目,我对这个项目很陌生。我遇到了一个我不太了解的逻辑。我有一个名为 A 的实体,它有这个字段/列:

@Column(name = "COD_UOP_COO")
    private String codUopCoo;

然后我在同一个实体中:

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "COD_UOP_COO", referencedColumnName = "COD_UOP")
    @BatchFetch(value = BatchFetchType.JOIN)
    private B b;

据我了解,这意味着通过在JoinColumn 注释中指定的字段上连接表AB 来检索b 字段,对吧?但是在这种情况下,连接是如何工作的? JPA 是否正在检索连接子句右侧的实体? 然后我有这个命名查询:

"select a from A a where (a.b.bfield = :parameter)"

这是什么意思?他们为什么要在实体B 的字段上检查相等性?在我的表A 中,我没有任何列是B 的外键。并且b 字段不是表A 中的列。那么我在检查A 的哪一列值?我缺少与数据库结构的链接。

【问题讨论】:

【参考方案1】:

JPQL 查询被转换为 SQL 查询。

此查询返回 A 对象,其中 A.COD_UOP_COO = B.COD_UOP 和 B.bfield = 参数。更改 B 类中元素的数据库列名称的 bfield。

你可以看到原生查询将这个参数添加到persistence.xml:

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>

【讨论】:

您好,谢谢。有没有解释翻译规则的指南?

以上是关于JPA @JoinColumn 自定义对象类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 通过自定义对象实体属性进行查询

我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?

如何使用查询而不是带有 JPA 的 @JoinColumn 映射实体关联?

当我使用两个表实体时如何在 JPA @JoinColumn 中指定忽略大小写

SpringData JPA多表关联操作

jpa hibernate @OneToOne @JoinColumn referencedColumnName 被忽略