@Where with @SecondaryTable 不适用于 Hibernate

Posted

技术标签:

【中文标题】@Where with @SecondaryTable 不适用于 Hibernate【英文标题】:@Where with @SecondaryTable does not work with Hibernate 【发布时间】:2019-02-06 11:08:09 【问题描述】:

我的模型中存在一对多关系,其中子实体存储在两个表中。

@Entity
@Table(name = "child1")
@SecondaryTable(name = "child2", pkJoinColumns = 
        @PrimaryKeyJoinColumn(name = "id1", referencedColumnName = "id1"),
        @PrimaryKeyJoinColumn(name = "id2", referencedColumnName = "id2"))
@Where(clause = "col1 is not null and col2 is not null")
@Data
@Immutable
public class Child implements Serializable ...

Child 实体与Parent 实体一起被急切地获取。问题出在@Where 子句中,它应该引用两个表中的列:col1 在表child1 中,col2child2 中。这会引发以下错误:

ERROR 12333 --- [nio-8183-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column (col2) not found in any table in the query (or SLV is undefined).
java.sql.SQLException: null
...
    仅使用:@Where(clause = "col1 is not null") 提供正确的映射并且不会产生错误。

    使用@Where(clause = "child1.col1 is not null and child2.col2 is not null") 会出现以下错误:

    Column (child1) not found in any table in the query (or SLV is undefined).
    

我怎样才能让@Where 使用两个表或有任何解决方法?

不过有一些要求:

    我使用 informix 作为底层数据库,并且具有只读访问权限。 我知道,它可以通过原生 SQL 甚至 JPQL/criteria API 等来解决,但是这样做会让我重写很多核心。我想避免它。

【问题讨论】:

【参考方案1】:

这是由于HHH-4246 问题造成的。

一种解决方法是使用@MapsId@SecondaryTable 替换为@OneToOne 关联。

这样,child2 表变成了Child2 实体,您可以对其使用@Where@Filter

【讨论】:

以上是关于@Where with @SecondaryTable 不适用于 Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

使用“with”加入 laravel 并在连接表中设置 where 语句

如何在标准 SQL 的 WHERE 子句中使用 WITH 子查询作为选项列表

Laravel Eloquent Where and or Where with Eager Load 无法正常工作

INSERT INTO WITH SELECT 和 WHERE(问题)

@Where with @SecondaryTable 不适用于 Hibernate

SQL where clause with composite values