transformers java_java – Hibernate给出一个奇怪的ClassCast异常(使用Transformers)

这段代码:

@Override

public List getAllFactsWithoutParentsAsFactDto() {

String completeQuery = FactCodeQueries.SELECT_DTO_FROM_FACT_WITH_NO_PARENTS;

Query query = createHibernateQueryForUnmappedTypeFactDto(completeQuery);

List factDtoList = query.list(); //line 133

return factDtoList;

}

调用此方法:

private Query createHibernateQueryForUnmappedTypeFactDto(String sqlQuery) throws HibernateException {

return FactCodeQueries.addScalars(createSQLQuery(sqlQuery)).setResultTransformer(Transformers.aliasToBean(FactCodeDto.class));

}

给我一个ClassCastException – >跟踪的一部分:

Caused by: java.lang.ClassCastException: be.fgov.just.cjr.dto.FactCodeDto cannot be cast to java.util.Map

at org.hibernate.property.access.internal.PropertyAccessMapImpl$SetterImpl.set(PropertyAccessMapImpl.java:102)

at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:78)

at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:75)

at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:435)

at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)

at org.hibernate.loader.Loader.list(Loader.java:2418)

at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:336)

at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1898)

at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:318)

at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:125)

at be.fgov.just.cjr.dao.factcode.FactCodeDAOImpl.getAllFactsWithoutParentsAsFactDto(FactCodeDAOImpl.java:133)

这很奇怪,因为实际上,如果你查看Hibernate的源代码,它会尝试这样做:

@Override

@SuppressWarnings("unchecked")

public void set(Object target, Object value, SessionFactoryImplementor factory) {

( (Map) target ).put( propertyName, value ); //line 102

}

这没有任何意义……

target的类型为Class,此代码尝试将其强制转换为Map,

为什么要这样做???

任何指针都非常受欢迎……

我正在使用Hibernate 5(并且从3升级)…

编辑:我也使用Spring(4.2.1.RELEASE;也升级)在部署时调用这些方法,任何调试指针也是最受欢迎的…

编辑2 :(整个FactCodeDto类,按要求)

package be.fgov.just.cjr.dto;

import be.fgov.just.cjr.model.FactCode;

import be.fgov.just.cjr.model.FactCodeType;

import be.fgov.just.cjr.utility.FullDateUtil;

import be.fgov.just.cjr.utility.Locales;

import lombok.Getter;

import lombok.Setter;

import lombok.ToString;

import org.springframework.util.Assert;

import java.util.*;

@Getter

@Setter

@ToString

public class FactCodeDto extends TreeNodeValue {

private String cdFact;

private String cdFactSuffix;

private Boolean isSupplementCode;

private Boolean isTitleCode;

private Boolean mustBeFollowed;

private Date activeFrom;

private Date activeTo;

private Boolean isCode;

private Long idFact;

private Long idParent;

private String type;

Map description = new HashMap(3);

public FactCodeDto() {

}

public FactCodeDto(String prefix, String suffix) {

super();

this.cdFact = prefix;

this.cdFactSuffix = suffix;

}

public FactCodeDto(String cdFact, String cdFactSuffix, Boolean isSupplementCode, Boolean mustBeFollowed) {

super();

this.cdFact = cdFact;

this.cdFactSuffix = cdFactSuffix;

this.isSupplementCode = isSupplementCode;

this.mustBeFollowed = mustBeFollowed;

}

public FactCodeDto(String cdFact, String cdFactSuffix, Boolean isSupplementCode, Boolean mustBeFollowed, Long idFact, Long idParent, Boolean isCode, Boolean isTitleCode, Date from, Date to, Map descriptions,String type) {

super();

this.cdFact = cdFact;

this.cdFactSuffix = cdFactSuffix;

this.isSupplementCode = isSupplementCode;

this.mustBeFollowed = mustBeFollowed;

this.idFact = idFact;

this.idParent = idParent;

this.isCode = isCode;

this.isTitleCode = isTitleCode;

this.activeFrom = from;

this.activeTo = to;

if (descriptions != null) {

this.description = descriptions;

}

this.type = type;

}

public FactCodeDto(FactCode fc) {

this(fc.getPrefix(), fc.getSuffix(), fc.isSupplementCode(), fc.isHasMandatorySupplCodes(), fc.getId(), fc.getParent(), fc.isActualCode(), fc.isTitleCode(), fc.getActiveFrom(), fc.getActiveTo(), fc.getAllDesc(),fc.getType().getCode());

}

public String formatCode() {

return FactCode.formatCode(cdFact, cdFactSuffix);

}

public boolean isActive() {

Date now = new Date(System.currentTimeMillis());

return FullDateUtil.isBetweenDates(now, this.activeFrom, this.activeTo);

}

public void setDescFr(String s) {

description.put(Locales.FRENCH, s);

}

public void setDescNl(String s) {

description.put(Locales.DUTCH, s);

}

public void setDescDe(String s) {

description.put(Locales.GERMAN, s);

}

/**

* public String toString() {

* StringBuilder sb = new StringBuilder();

* sb.append(getIdFact() + ": ")

* .append(getIdParent() + ": ")

* .append(" " + cdFact + cdFactSuffix + ": " + (isSupplementCode ? "NO Principal " : " Principal "))

* .append((mustBeFollowed ? " Must Be Followed " : "NOT Must Be Followed "));

* return sb.toString();

* }

*/

public Map getDescription() {

return description;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

String fullCode = formatCode();

result = prime * result + ((fullCode == null) ? 0 : fullCode.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj) {

return true;

}

if (obj == null) {

return false;

}

if (getClass() != obj.getClass()) {

return false;

}

FactCodeDto other = (FactCodeDto) obj;

return formatCode().equals(other.formatCode());

}

@Override

public boolean isChildOf(TreeNodeValue value) {

Assert.notNull(value);

boolean isChild = false;

if (value instanceof FactCodeDto) {

if (this.getIdParent() != null) {

isChild = this.getIdParent().equals(((FactCodeDto) value).getIdFact());

}

}

return isChild;

}

@Override

public boolean isBrotherOf(TreeNodeValue value) {

Assert.notNull(value);

boolean isBrother = false;

if (value instanceof FactCodeDto) {

if (this.getIdParent() != null) {

isBrother = this.getIdParent().equals(((FactCodeDto) value).getIdParent());

}

}

return isBrother;

}

@Override

public boolean isParentOf(TreeNodeValue value) {

Assert.notNull(value);

boolean isParent = false;

if (value instanceof FactCodeDto) {

isParent = this.getIdFact().equals(((FactCodeDto) value).getIdParent());

}

return isParent;

}

@Override

public int compareTo(TreeNodeValue to) {

if (to instanceof FactCodeDto) {

return formatCode().compareTo(((FactCodeDto) to).formatCode());

} else return 1;

}

public String getCode() {

return formatCode();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值