Marcus Dunn
02/08/2021, 11:24 PMFetchType.LAZY to a schema-exposed class? If I pass a entity to the constructor then just call the field inside the function (example below) I'll receive an error because the session is closed by the time the function is called.
I have this entity class
@Entity
class Foo(
@Id
val id: Long
@OneToOne(fetch = FetchType.LAZY)
var bar: Bar
)
this class here is the one exposed to the schema, its mapped almost 1-1 with the Foo class, but with the potential to have more fields I don't necessarily want in the Foo entity.
class GraphQlFoo(private val entity: Foo) {
val id = entity.id
fun bar() = GraphQLBar(entity.bar)
}
This setup breaks at the moment, Ideally I'd like some way to fetch bar if and only if it was requested, and not have to do unessisary joins if it the request doesn't include it. I'd also like to do all this logic in a single session, as opening a second to just fetch bar seems unneeded which is what my current solution does via fun bar(@GraphQLIgnore @Autowired barRepository: BarRepository) = barRepository.getByFooId(id)Shane Myrick
02/09/2021, 12:02 AMGraphQLFoo.bar() function only runs when the client has the bar field in their query. I am not too familiar with JPA, but if the entity is already constructed and executed before hand then, yes, you are going to still be running the code even if no client even selects foo.
The approach you mentioned by using the barRepository would be my recommended way but you can also achieve that with the constructor params
class GraphQlFoo (
private val entity: Foo,
private val barRepository: BarRepository
) {
val id = entity.id
fun bar() = barRepository.getByFooId(entity.id)
}Marcus Dunn
02/09/2021, 12:07 AMbar have no extra overhead. The issue is (and perhaps I'm over-engineering this) is that barRepository.getByFooId(entity.id) opens up a second session (the first one being the original query for Foo) and doesn't use the fact I've got the foreign key for Bar in the Foo entity already (albeit without the join having occurred yet).