【发布时间】:2014-10-09 12:27:59
【问题描述】:
我有根实体Hostel 及其单一关联User owner。
当我获取 Hostel 实体时,我需要急切地获取 User owner,但只有所有者的 3 个属性:userId、firstName、lastName。
此外,在这个查询中,我不需要获取User owner 的一些关联。它们是:User 实体的avatar 和images。
现在我的条件查询是:
@SuppressWarnings("unchecked")
public void findHostelBy(HostelSearch hs) {
Criteria criteria = currenSession().createCriteria(Hostel.class);
String country = hs.getCountry();
criteria.add(Restrictions.ge("endDate", Calendar.getInstance()));
if (StringUtils.notNullAndEmpty(country)) {
criteria.add(Restrictions.eq("country", country));
}
// making Hostel's associations lazy
criteria.setFetchMode("images", FetchMode.SELECT);
criteria.setFetchMode("requests", FetchMode.SELECT);
criteria.setFetchMode("feedbacks", FetchMode.SELECT);
criteria.setReadOnly(true);
criteria.addOrder(Order.desc("rating"));
// retrieve owner association
criteria = criteria
.createAlias("owner","owner",JoinType.LEFT_OUTER_JOIN)
.setProjection(
Projections.projectionList()
.add(Projections.property("owner.userId"))
.add(Projections.property("owner.firstName"))
.add(Projections.property("owner.lastName")))
.setFetchMode("owner.avatar", FetchMode.SELECT)
.setFetchMode("owner.images", FetchMode.SELECT);
Long count = (Long) criteria
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
List<Hostel> hostels = criteria.list();
for (Hostel hostel : hostels) {
User owner = hostel.getOwner();
System.out.println("owner=" + owner);
}
}
在// retrieve owner association cmets 之后,我会获取User owner 关联。我通过以下方式将 owner 的选择限制为 3 个属性:
Projections.projectionList()
.add(Projections.property("owner.userId"))
.add(Projections.property("owner.firstName"))
.add(Projections.property("owner.lastName")))
然后我把主人公的联想头像和图片做懒人:
.setFetchMode("owner.avatar", FetchMode.SELECT)
.setFetchMode("owner.images", FetchMode.SELECT);
我在网上遇到异常
List<Hostel> hostels = criteria.list();
例外是:
Caused by: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.home.hostme.entity.Image. Expected: class java.lang.Long, got class java.lang.Integer
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:134)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1019)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:672)
at org.hibernate.type.EntityType.resolve(EntityType.java:490)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1107)
at org.hibernate.loader.Loader.processResultSet(Loader.java:963)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
at org.hibernate.loader.Loader.doList(Loader.java:2522)
at org.hibernate.loader.Loader.doList(Loader.java:2508)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2338)
at org.hibernate.loader.Loader.list(Loader.java:2333)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
at com.home.hostme.dao.impl.HostelDaoImpl.findHostelBy(HostelDaoImpl.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
... 51 more
根 Hostel 实体的主键列是 Integer,但 Image 实体的主键是 Long。但我不想急切地从User owner 检索avatar 或images,我描述了它。
如何更新我的查询以从 User owner 关联中延迟获取 avatar 和 images?
此查询从 User owner 关联中获取所有属性,因此我的限制不起作用。
附言如果我不获取User owner 关联,那么一切正常。
【问题讨论】:
标签: java hibernate hibernate-criteria