There is a one-to-many relationship in my model, where the child entity is stored in two tables.
@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 entity is fetched eagerly together with Parent entity. Problem lies within @Where clause, which should reference columns from two tables: col1 is in table child1 and col2 is in child2. This throws the following error:
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 ...
- Using only:
@Where(clause = "col1 is not null")gives propper mapping and results in no error. Using
@Where(clause = "child1.col1 is not null and child2.col2 is not null")gives the following error:Column (child1) not found in any table in the query (or SLV is undefined).
How can I make @Where work with two tables or is there any workaround?
There are some requirements though:
- I’m using informix as an underlying database and have read-only access.
- I know, that it can be solved by native SQL or even JPQL / criteria API and so on, but doing so would make me rewrite a lot of core. I want to avoid it.
Advertisement
Answer
This is due to the HHH-4246 issue.
A workaround would be to replace the @SecondaryTable with a @OneToOne association using @MapsId.
This way, the child2 table becomes the Child2 entity for which you can use @Where or @Filter.