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>

すべてうまくいきますが、次のように Method で Projection を変更して使用すると、例外が発生します

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

変更点: メソッドでの ProjectList の使用

    @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>

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 

}

ログファイルからクエリを確認します。正常に実行されます

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_

両方ともリストを返し、サイズ()の両方をチェックしましたが、サイズも同じです!

私を更新してください!

4

1 に答える 1