2

我正在使用 Spring MVC + Hibernate

通用道

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

@控制器

    @RequestMapping(value = "/genCompanyInfoUpdate", method = RequestMethod.POST)
public String genCompanyInfoUpdate(Model model) {

    List<GenCountryModel> countryList=pt.getAll(GenCountryModel.class);
    List<GenCurrencyModel> currencyList=pt.getAll(GenCurrencyModel.class);

    GenCompanyInfoModel companyInfo=pt.getById(GenCompanyInfoModel.class, 1);

    model.addAttribute("countryList", countryList);
    model.addAttribute("currencyList", currencyList);
    model.addAttribute("companyInfo", companyInfo);

    return "gen/genCompanyInfoUpdate";
}

JSP

<c:if test="${not empty currencyList}">
    <c:forEach items="${currencyList}" var="get" varStatus="counter">
    <ct:Options setValue="${get.id}" setName="${get.isoCode}" selected="${companyInfo.genCurrencyModel.id}" setState="1" />
</c:forEach>
</c:if>

一切正常,但是当我如下更改和使用方法中的投影时,它会给出异常

java.lang.numberformatexception for input string id 
java.lang.numberformatexception for input string isoCode

更改:ProjectionList 在方法中的使用

    @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();
}

@Controller 中的更改传递列表 [GenCurrencyModel]

    @RequestMapping(value = "/genCompanyInfoUpdate", method = RequestMethod.POST)
public String genCompanyInfoUpdate(Model model) {

    String []list={"id","isoCode"};

    List<GenCountryModel> countryList=pt.getAll(GenCountryModel.class);
    List<GenCurrencyModel> currencyList=pt.getAll(GenCurrencyModel.class,list);

    GenCompanyInfoModel companyInfo=pt.getById(GenCompanyInfoModel.class, 1);

    model.addAttribute("countryList", countryList);
    model.addAttribute("currencyList", currencyList);
    model.addAttribute("companyInfo", companyInfo);

    return "gen/genCompanyInfoUpdate";
}

相同的 JSP

<c:if test="${not empty currencyList}">
    <c:forEach items="${currencyList}" var="get" varStatus="counter">
    <ct:Options setValue="${get.id}" setName="${get.isoCode}" selected="${companyInfo.genCurrencyModel.id}" setState="1" />
</c:forEach>
</c:if>

代币模型

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 

}

我从日志文件中检查查询。它成功执行

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

<ct:Options setValue="${get.id}" setName="${get.isoCode}" 

注意:ct:Options 是一个自定义的 JSP 标签,它只是打印值,没什么特别的

投影后查询结果如下

Hibernate: select this_.CURRENCYID as y0_, this_.ISOCODE as y1_ from GENCURRENCY this_

并且都返回列表,并且我检查了两个 size(),大小也相同!

让我知道 !

4

1 回答 1

2

通常,当在 Hibernate 中使用特定属性的投影列表时,您将无法将查询结果转换为实体类型,至少在我熟悉的旧版本的 Hibernate(即 3.2.x)中不能。相反,默认返回类型将是List<Object[]>(调用时Criteria#list),其中每个数组表示您在投影列表中指定的属性的元组。Criteria(您可以通过给出a来告诉 Hibernate 更改返回类型ResultTransformer,但这可能会导致更多混乱。)因此,与其期望类型的部分水合实体T并调用其 getter 方法(通过 JSTL 表达式),不如期望Objects 和通过索引获取每个属性值(基于投影列表中属性的顺序)。

否则,您似乎将字符串值传递给您的标签库(而不是您想要的"id"and字段值),我假设它期望可以使用类似的东西解析为数字的字符串,这导致s。"isoCode"ctidisoCodeInteger#parseInt(String)NumberFormatException

如果这没有帮助,您能否提供更多信息?具体来说:

  • 您在投影列表中指定的属性名称是什么?
  • 这些属性映射为实体类中的哪些对象类型?提供完整的实体映射会有所帮助。
  • ct:Options自定义 JSP 标记吗?如果有,能否提供标签类的逻辑?
于 2013-06-05T02:57:09.883 回答