我正在研究一个使用 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;
据我了解,这意味着b
字段是通过在注释中指定的字段上A
和B
连接表来检索JoinColumn
,对吧?但是在这种情况下,联接是如何工作的呢?JPA 是否检索连接子句右侧的实体?
然后我有这个命名查询:
"select a from A a where (a.b.bfield = :parameter)"
这是什么意思?他们为什么要检查实体B
字段的相等性?在我的表中A
我没有任何带有B
的外键列。并且b
字段不是表 A
中的列。那么我要检查的是A
的哪个列值呢?我缺少与数据库结构的链接。
JPQL 查询被转换为 SQL 查询。
此查询返回 A 对象,其中 A.COD_UOP_COO = B.COD_UOP 和 B.bfield = 参数。更改 b 类中元素的数据库列名称的 bfield。
您可以看到 native 查询将此参数添加到持久性.xml:
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>