jpa - Hibernate FetchMode = Join doesn't work -
i see hibernate firing multiple queries fetchmode=join
below entity classes
@entity @table(name = "person") public class personjpa{ @id @column(name = "person_id") @generatedvalue private long personid; @onetomany(mappedby = "personid",cascade=cascadetype.all) @fetch(value = fetchmode.join) private set<addressjpa> address; ...... } and
@table(name = "address") public class addressjpa { @id @column(name = "address_id") @generatedvalue private long addressid; @manytoone(fetch = fetchtype.lazy) @joincolumn(name = "person_id") private personjpa personid; } how write jpa criteriaquery selects personjap addressjpa list given personid ?
do want retrieve personjpa object given person id, such associated addressjpa set collection loaded? in case, need fetch join.
in criteria api:
entitymanager em = entitymanagerfactory.createentitymanager(); criteriabuilder cb = em.getcriteriabuilder(); criteriaquery<personjpa> query = cb .createquery(personjpa.class); root<personjpa> person = query.from(personjpa.class); query.fetch("address"); query.select(person); parameterexpression<long> p = cb.parameter(long.class); query.where(cb.equal(cb.get("personid"), p)); in jp ql:
select p personjpa p join fetch p.address p.personid = :p alternatively, might want specify fetch mode (eager) in annotations (since default associated collections lazily loaded):
@onetomany(mappedby = "personid",cascade=cascadetype.all, fetch=fetchtype.eager) private set<addressjpa> address; @fetch annotation hibernate specific , not jpa. specifies strategy on how data should fetch. see more info here.
Comments
Post a Comment