Open mj-p opened 3 months ago
If you look closely not only is the inlined query overfetching
Overfetching in a from-clause subquery should not be a problem. Optimizers usually prune away unnecessary select items. There is unfortunately no way to get rid of the overfetching here, because the subquery must produce something that is compatible with an entity fetch.
but also binding the id of c1_0 to ft1_0.id which is a @OneToOne relation on the entity!
I'm not sure I understand that. Could you be more specific? Also, I don't know the entity model you're using, so it's hard to understand what this "toy" table is representing.
The relation looks like this: For Cat
@OneToOne(mappedBy = "cat")
private Toy favouriteToy;
For Toy
@Id
@GeneratedValue
private Long id;
@OneToOne
private Cat cat;
Now from the lateral join the binding for the Cat is this line with id
being the 4th param
c1_0(a_id, age, father_id, id, mother_id, name, owner_id)
And the fetched fields are those with the 4th field being ft1_0.id
SELECT c2_0.a_id, c2_0.age, c2_0.father_id, ft1_0.id, c2_0.mother_id, c2_0.name, c2_0.owner_id
Which effectively sets the id of c1_0 to the id of ft1_0 and therefore results in a CatView with a wrong id. Meaning for example if your Cat Entity has id 1 and the Toy Entity has id 2 the query results in CatView with id 2.
Ok, this looks like a bug to me. Could you please try to create a reproducer for this? You can use a quickstart project for this purpose and attach it here.
I hope this is enough to work with. I replaced the DbmsDialect of H2 with the PostgreSQL one in the Configuration to make sure the buggy query gets created. This will throw an exception in the end. If this is not enough, a real Postgres should be used.
Hi, there is again something going on when using
@Limit
and this time when using it withFetchStrategy.SUBSELECT
while having support for lateral joins like with Postgres. The example is the same like I provided in #1875 only changing the fetch type:Now this works fine and would even be a valid workaround for the problem I described in #1875 if you have no lateral support like with H2. With lateral support the subquery will be inlined using FullSelectCTECriteriaBuilder resulting in a query like this:
If you look closely not only is the inlined query overfetching but also binding the id of
c1_0
toft1_0.id
which is a@OneToOne
relation on the entity! So there are two issues when using@Limit
with SUBSELECT while having lateral support.@OneToOne
relations on the entity may introduce unnecessary joins and then bind the id wrongly.Disabling the lateral support via PostgreSQLDbmsDialect does help here but is not really a nice workaround.
Version: 1.6.11 JPA-Provider: Hibernate 6.4.1 DBMS: Postgres 16