This code:
@Override public List<FactCodeDto> getAllFactsWithoutParentsAsFactDto() { String completeQuery = FactCodeQueries.SELECT_DTO_FROM_FACT_WITH_NO_PARENTS; Query query = createHibernateQueryForUnmappedTypeFactDto(completeQuery); List<FactCodeDto> factDtoList = query.list();
call this method:
private Query createHibernateQueryForUnmappedTypeFactDto(String sqlQuery) throws HibernateException { return FactCodeQueries.addScalars(createSQLQuery(sqlQuery)).setResultTransformer(Transformers.aliasToBean(FactCodeDto.class)); }
gives me a ClassCastException -> trace part:
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)
This is rather strange because, indeed, if you look at the source code of Hibernate, it tries to do this:
@Override @SuppressWarnings("unchecked") public void set(Object target, Object value, SessionFactoryImplementor factory) { ( (Map) target ).put( propertyName, value );
Which makes no sense ...
target is of type Class, and this code tries to pass it to Map,
why is he trying to do this?
any pointers are more than welcome ...
I am using Hibernate 5 (and upgrading from 3) ...
edit: I also use Spring (4.2.1.RELEASE, as well as an update), which calls these methods on deployment, any debug pointers are also welcome ...
edit 2: (whole class FactCodeDto, on request)
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<Locale, String> description = new HashMap<Locale, String>(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<Locale, String> 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 Map<Locale, String> 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(); } }