Данные Spring создают внутреннее соединение OneToMany

Поэтому я использую данные весны, и у меня возникла проблема с попыткой получить список для этого запроса на спящий режим.

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> } 

Этот запрос создает такой запрос на спящий режим.

 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 

Это плохой запрос.

Я также попробовал bc вместо b.fooContext в HQL, но потом я не получаю коллекцию, я получаю один FooContextPO.

Мои сущности похожи

 @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> ) 

Есть ли какой-то способ для меня, чтобы левое соединение работало правильно здесь, не создавая внутреннего соединения?

Вы определенно получаете внутреннее соединение из-за выбора сопоставленного свойства b.fooContext в b.fooContext

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

Вы отдельно FooContextPO к FooContextPO как bc поэтому, если вы хотите избежать внутреннего соединения, вы не можете ссылаться на отображаемое свойство fooContext . Поэтому вам нужно будет выбрать bc вместо этого.

Это факт, что вы получаете только 1 запись из-за фактических базовых данных? b.fooContext ли SQL его генерирование при выборе bc вместо b.fooContext неверно? Если так … можете ли вы поделиться тем, что выглядит в этом sql?

Intereting Posts
Ошибка Kotlin: Кинжал не поддерживает инъекцию в частные поля Как передать тип nullable в функцию, которая принимает непустой тип? Котлин и подробный экземпляр массива Android Studio 3.0 Kotlin не работает должным образом Сбор Kotlin + Maven: нет основного атрибута манифеста Как создать экземпляр универсального класса, передающего ссылку метода в конструкторе с kotlin Dagger2 вводит презентатора в ошибку активности Kotlin Вызов метода класса по умолчанию arg в конструкторе Каков канонический способ преобразования массива <Byte> в ByteArray Кинжал 2: несколько записей с одним и тем же ключом Android ClassNotFoundException Не нашел класс на пути: DexPathList DBFlow: могу ли я удалить один из них с отключением списка? Как получить доступ к значению поля в методе get () Невозможно создать привязки вида java.lang.NullPointerException Как справляться с общими границами, переносящимися с Java на Kotlin?