输入字符串的hibernate projection NumberFormatException 我正在使用Spring MVC+Hibernate

输入字符串的hibernate projection NumberFormatException 我正在使用Spring MVC+Hibernate,spring,hibernate,projection,hibernate-criteria,numberformatexception,Spring,Hibernate,Projection,Hibernate Criteria,Numberformatexception,通用Dao // getAll @SuppressWarnings("unchecked") public <T> List<T> getAll(Class<T> entityClass) throws DataAccessException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass); return criteria.

通用Dao

// getAll
@SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass) throws DataAccessException {
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
    return criteria.list();
}
    @SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass, String[] nameList) throws DataAccessException {
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);

ProjectionList pl = Projections.projectionList();

    for (int i=0; i<nameList.length; i++) {
        pl.add(Projections.property(nameList[i].toString()));   
    }

    criteria.setProjection(pl);

    return criteria.list();
}
Hibernate: select this_.CURRENCYID as y0_, this_.ISOCODE as y1_ from GENCURRENCY this_
更改:投影列表在方法中的使用

// getAll
@SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass) throws DataAccessException {
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
    return criteria.list();
}
    @SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass, String[] nameList) throws DataAccessException {
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);

ProjectionList pl = Projections.projectionList();

    for (int i=0; i<nameList.length; i++) {
        pl.add(Projections.property(nameList[i].toString()));   
    }

    criteria.setProjection(pl);

    return criteria.list();
}
Hibernate: select this_.CURRENCYID as y0_, this_.ISOCODE as y1_ from GENCURRENCY this_
}

我检查日志文件中的查询。它成功地执行了

当我从jsp页面中删除以下行时,没有任何异常

<ct:Options setValue="${get.id}" setName="${get.isoCode}" 
并且都返回列表,我已经检查了这两个size(),大小也是一样的


更新我

通常,在Hibernate中使用特定属性的投影列表时,您将无法将查询结果转换为实体类型,至少在我熟悉的Hibernate的旧版本(即3.2.x)中是这样。相反,默认返回类型将是
列表
(调用
标准#列表
),其中每个数组表示在投影列表中指定的属性的元组。(您可以告诉Hibernate更改返回类型,方法是提供
条件
a
ResultTransformer
,但这可能会导致更多混淆。)因此,与其期望类型为
T
的部分水合实体并调用其getter方法(通过JSTL表达式),需要一个
Object
s数组,并按索引(基于投影列表中属性的顺序)获取每个属性值

否则,您似乎正在将字符串值
“id”
“isoCode”
传递到
ct
标记库(而不是您想要的
id
isoCode
字段值),我假设这些字符串可以使用
Integer\parseInt(string)之类的东西解析为数字
,这会导致出现
NumberFormatException
s

如果这没有帮助,你能提供更多的信息吗?具体而言:

  • 您在投影列表中指定的属性名称是什么
  • 这些属性映射为实体类中的哪些对象类型?提供完整的实体映射将有所帮助
  • ct:Options
    是自定义JSP标记吗?如果是这样,您能提供tag类的逻辑吗

我已经编辑了这篇文章!愿你明白。为什么在第二种情况下,有一个例外。但第一个案例运作良好。实际上,投影不应该改变返回的结构。。。如果结构发生变化,如何在spring MVC中对此进行控制?我无法理解异常增益编辑的原因:也提供GenCurrencyModel类您可以将以下行添加到控制器方法并发布输出吗
System.out.println(“currencyList的第一个元素的类型为:”+currencyList.get(0.getClass())
System.out.println(“currencyList中第一个元素的Id值为:”+((GenCurrencyModel)currencyList.get(0)).getId())无投影:
currencyList的第一个元素的类型为:class com.soft.erp.gen.model.GenCurrencyModel currencyList中第一个元素的Id值为:1
但有投影的嵌套异常为java.lang.ClassCastException:[Ljava.lang.Object;无法转换为com.soft.erp.gen.model.GenCurrencyModel]
因此带有投影的将返回
列表
。您可以在dao中使用如下代码手动解决此问题:
listl=(List)criteria.List()
列表c=newArrayList()
`GenCurrencyModel m=new GenCurrencyModel()`
public class GenCurrencyModel implements Serializable{

private static final long serialVersionUID = 1L;


@Id
@Column(name = "CURRENCYID")
@GeneratedValue
private long id;


@Column(name = "CODE")
private String currencyCode;

@Column(name = "DESCRIPTION")
private String currencyDesc;

@Column(name = "ISACTIVE")
private int isActive;

@Column(name = "MADELETE")
private int markAsDelete;

@Column(name = "ISOCODE")
private String isoCode;

@Column(name = "CURRENCYUNIT")
private String currencyUnit;

@Column(name = "CONNECTOR")
private String connector;

@Column(name = "SUBUNIT")
private String subUnit;

@Column(name = "RECENTUSERID")
private long recentUserId;

@Column(name = "RECENTUSERIP")
private String recentUserIp;

@Column(name = "DATETIME")
private Date dateTime;

@Column(name = "ISUPDATED")
private int isUpdated;

private GenCompanyInfoModel genCompanyInfoModel;


public GenCurrencyModel() {
    super();
}

//Getter Setter 
<ct:Options setValue="${get.id}" setName="${get.isoCode}" 
Hibernate: select this_.CURRENCYID as y0_, this_.ISOCODE as y1_ from GENCURRENCY this_