我在使用AliasToBeanResultTransformer的Hibernate HQL 投影时遇到问题,基本上我试图返回的结果没有正确映射到 bean,情况如下:
我正在使用的 HQL 查询是这样的:
select entity.categoryTypes as categoryTypes from nz.co.doltech.ims.server.entities.IncidentEntity entity where (entity.id = :id105019)
我想从基于它的加入关系中获取CategoryType
's 。IncidentEntity
当我不尝试在其上使用任何变压器时,这可以正常工作。categoryTypes
是一个 Set 并且转换器不断尝试检查方法的参数类型并失败,因为它没有找到 aCategoryTypeEntity
而是找到 a java.util.Set
,就好像它试图将单个映射CategoryTypeEntity
到categoryTypes
字段中一样。我本以为因为它是一个 Set ,所以它会将数据作为 a 拉出Set
,然后尝试将其映射到该categoryTypes
字段。显然不是。
@javax.persistence.Entity(name = "incidents")
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)
public class IncidentEntity implements Entity {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "incident_categorytype", joinColumns = {
@JoinColumn(name = "incident_id", nullable = false, updatable = false) },
inverseJoinColumns = {
@JoinColumn(name = "categorytype_id", nullable = false, updatable = false)
})
private Set<CategoryTypeEntity> categoryTypes = new HashSet<CategoryTypeEntity>();
...
public Set<CategoryTypeEntity> getCategoryTypes() {
return categoryTypes;
}
public void setCategoryTypes(Set<CategoryTypeEntity> categoryTypes) {
this.categoryTypes = categoryTypes;
}
}
这是我打的电话:
Query query = session.createQuery("select entity.categoryTypes as categoryTypes from nz.co.doltech.ims.server.entities.IncidentEntity entity " +
"where (entity.id = :id105019)")
query.setResultTransformer(Transformers.aliasToBean(IncidentEntity.class));
return query.list();
我得到的例外是:
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of nz.co.doltech.ims.server.entities.IncidentEntity.categoryTypes
...
Caused by: java.lang.IllegalArgumentException: argument type mismatch
休眠日志消息是:
Jun 27, 2014 12:32:11 AM org.hibernate.property.BasicPropertyAccessor$BasicSetter set
SEVERE: IllegalArgumentException in class: nz.co.doltech.ims.server.entities.IncidentEntity, setter method of property: categoryTypes
Jun 27, 2014 12:32:11 AM org.hibernate.property.BasicPropertyAccessor$BasicSetter set
SEVERE: expected type: java.util.Set, actual value: nz.co.doltech.ims.server.entities.CategoryTypeEntity
使用休眠 3.6.10
谁能看到这里发生了什么?这看起来真的不像正常行为,也许我做错了什么。将不胜感激我能得到的任何帮助!
更新:这很奇怪,与问题没有直接关系。当我将休眠 use_query_cache 属性设置为 true 时,我在 AliasToBeanResultTransformer 中不断将投影结果设为 null (然后结果返回为 null (或 [null, null, null] 取决于返回的数量。我认为这可能是一个错误? 关于手头的问题,当我删除结果转换器时,它CategoryTypeEntites
按预期返回 3。当它添加时,我得到一个 CategoryTypeEntity,它正在 Transformers 的 transformTuple 方法中处理。对这两个问题真的很困惑。
干杯,本