2017-03-02 25 views
0

有一個DAO方法返回一個列表:如何從列表中創建select元素<Object[]>?

@Transactional 
public List<Object[]> list() { 

    String sql = "select pnd_code, to_char(pnd_intitule) l from pnd order by l"; // pnd_intitule is a CLOB column 

    Query query = sessionFactory.getCurrentSession().createSQLQuery(sql); 

    @SuppressWarnings("unchecked") 
    List<Object[]> list = (List<Object[]>) query.list(); 

    return list; 

} 

在我的JSP,我想創建從它選擇的元素;這裏是我試過的(但它在運行時崩潰):

<select id="pnd" style="width:500px;"> 
    <option value=""> -- S&eacute;lectionner -- </option> 
    <c:forEach items="${pnds}" var="pnd"> 
     <option value="${pnd.pnd_code}">${pnd.l}</option> 
    </c:forEach> 
</select> 

那麼如何在這種情況下創建select元素?

回答

1

幫你一個忙,並創建一個封裝你的數據的自定義類。

class MyCustomClass{ // change name 
    private final String lecturer; 
    private final String code: 
    // initialize fields in constructor 
    // add getters 
} 

DAO類:

public List<MyCustomClass> list() { 

    String sql = "select pnd_code, to_char(pnd_intitule) l from pnd order by l"; // pnd_intitule is a CLOB column 

    Query query = sessionFactory.getCurrentSession().createSQLQuery(sql); 

    @SuppressWarnings("unchecked") 
    return ((List<Object[]>) query.list()) 
     .stream() 
     .map(oo -> new MyCustomClass(oo[0].toString(), oo[1].toString())) 
     .collect(Collectors.toList()); 

} 

老派的Java 7的版本:

public List<MyCustomClass> listWithoutLambdasAndStreams() { 

    String sql = "select pnd_code, to_char(pnd_intitule) l from pnd order by l"; // pnd_intitule is a CLOB column 

    Query query = sessionFactory.getCurrentSession().createSQLQuery(sql); 

    @SuppressWarnings("unchecked") 
    List<Object[]> list = (List<Object[]>) query.list(); 
    List<MyCustomClass> youShouldReallyLearnAboutLambdasAndStreams = 
     new ArrayList<>(list.size()); 
    for(Object[] oo: list){ 
     youShouldReallyLearnAboutLambdasAndStreams.add(
      new MyCustomClass(oo[0].toString(), oo[1].toString())); 
    }; 
    return youShouldReallyLearnAboutLambdasAndStreams; 
} 

JSP:

<select id="pnd" style="width:500px;"> 
    <option value=""> -- S&eacute;lectionner -- </option> 
    <c:forEach items="${pnds}" var="pnd"> 
     <option value="${pnd.code}">${pnd.lecturer}</option> 
    </c:forEach> 
</select> 
+0

有錯誤:Lambda表達式是從源頭上只允許級別1.8或以上,即使我設置項目jre系統libr ary to 1.8 – pheromix

+0

@pheromix然後切換到源代碼級別1.8或重構我的代碼不使用lambdas –

+0

請你可以重構它,因爲我不知道lambda表達式。 – pheromix