Spring Data crea una unión interna en OneToMany

Así que estoy usando datos de spring, y estoy teniendo un problema al tratar de get una list para esta consulta de hibernación.

interface NewFooWithMetadataDAO : Repository<Foo, Int> { @Query("""SELECT NEW com.foo.persistence.sql.po.NewFooWithMetadataPO( b.id, b.accountId, bi.profitCenterSegmentation, b.fooContext ) from Foo b left join b.fooIntent bi left join b.fooContext bc where account_id = ?1 group by b.id """) fun findByAccountId(accountId: Int): List<NewFooWithMetadataPO> } 

Esta consulta crea una consulta de hibernación como esta.

 select foo0_.id as col_0_0_, foo0_.account_id as col_1_0_, foo_buc1_.profit_center_segmentation as col_2_0_, . as col_3_0_ from foo foo0_ left outer join foo_intent foo_buc1_ on foo0_.foo_intent_id=foo_buc1_.id left outer join foo_context_map foocont2_ on foo0_.id=foocont2_.foo_id inner join foo_context_map foocont3_ on foo0_.id=foocont3_.foo_id where account_id=? group by foo0_.id 

Que es una mala consulta

También probé bc lugar de b.fooContext en el HQL, pero luego no obtuve una colección, obtengo un solo FooContextPO.

Mis entidades son como

 @Entity @Table(name = "foo") data class Foo( @Id val id: Int, @Column(name= "account_id") val accountId: Int, @OneToOne @JoinColumn(name = "foo_intent_id", referencedColumnName = "id") @NotFound(action=NotFoundAction.IGNORE) val fooIntent: FooIntentPO, @OneToMany @JoinColumn(name = "foo_id", referencedColumnName = "id") @NotFound(action=NotFoundAction.IGNORE) val fooContext: Collection<FooContextPO> ){ @Entity @Table(name = "foo_intent") data class FooIntentPO( @Id val id: Int, @Column(name = "profit_center_segmentation") val profitCenterSegmentation: String ) @Entity @Table(name = "foo_context_map") data class FooContextPO( @Id val id: Int, @Column(name = "foo_id") val fooId: Int, @OneToOne @JoinColumn(name = "context_id", referencedColumnName = "id") val context: ContextPO ) @Entity @Table(name = "context") data class ContextPO ( @Id val id: Int, @ManyToOne @JoinColumn(name = "foo_id", referencedColumnName = "id") val foo: Foo, @Column(name = "context") val context: String ) } data class NewFooWithMetadataPO( val id: Int, val accountId: Int?, val profitCenterSegmentation: String?, val context: Collection<Foo.FooContextPO> ) 

¿Hay alguna forma de que la combinación izquierda funcione correctamente aquí sin que genere una unión interna?

Definitivamente obtendrá la unión interna debido a la selección de la propiedad mapeada b.fooContext en la siguiente b.fooContext

 SELECT NEW com.foo.persistence.sql.po.NewFooWithMetadataPO( b.id, b.accountId, bi.profitCenterSegmentation, b.fooContext )... 

Está uniéndose FooContextPO separado a FooContextPO como bc por lo que si desea evitar la combinación interna, no puede hacer reference a la propiedad mapeada fooContext . Por lo tanto, deberá seleccionar bc lugar.

¿Es el hecho de que solo está recuperando 1 logging debido a los datos subyacentes reales? ¿El SQL se genera al seleccionar bc lugar de b.fooContext parece incorrecto? Si es así … ¿puedes compartir cómo se ve ese sql?