2012-11-26 60 views
2

有沒有辦法在<c:forEach>中通過從jOOQ循環?循環播放結果<Record> from jOOQ in <c:forEach>

這裏的getter方法:

public Vector<Map<String, String>> getUsers() { 
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL); 
    Result<Record> results = sql.select().from("users").fetch(); 

    Vector<Map<String, String>> v = new Vector<Map<String, String>>(); 
    for(Record item: results) { 
     Map<String, String> m = new HashMap<String, String>(); 
     m.put("login", item.getValueAsString("login")); 
     // other columns 
     v.add(m); 
    } 
    return v; 
} 

這裏的觀點:

<c:forEach var="u" items="${users}"> 
    ${u.login} <br /> 
</c:forEach> 

有沒有辦法讓我的getter方法簡單,如:

public Result<Record> getUsers() { 
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL); 
    reutrn sql.select().from("users").fetch(); 
} 

但正如前面提到的我不知道如何在<c:forEach>中循環,或者不可能?

回答

1

看來你想上的記錄,如果他們的地圖進行操作。以下是如何與jOOQ來實現這一目標:

public List<Map<String, Object>> getUsers() { 
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL); 
    return sql.select().from("users").fetchMaps(); 
} 

請參閱相關的Javadoc在這裏:

+0

感謝那就是我正在尋找。必須更加精彩地閱讀手冊 –

-1

我會使用像Hibernate這樣的ORM庫,所以您只需遍歷一個普通的對象列表即可。

如果您只是在執行JDBC操作,但看起來您已達到對您有用的位置,這看起來有點沉重。事情是這樣的......

@Entity 
@Table(name = "users") 
class User { 
    private String login; 
    ... 
} 

,然後一個DAO類這樣的...

public List<Users> getUsers() { 
    return (List<Users>)sessionFactory.getCurrentSession().createQuery("from Users").list(); 
} 

顯然有大量的設置和這樣帶來休眠到你的項目,但我認爲好處outweight那。

編輯:我不認爲JOOQ可以做ORM,但它似乎有一個行映射系統。如果您想堅持使用JOOQ,請嘗試創建一個RecordHandler並使用fetchInto()方法。

+0

如果你已經有休眠/ JPA實體,當然你可以進行交互。與他們通過jOOQ以及](http://www.jooq.org/doc/2.6/manual/sql-execution/fetching/pojos/)。沒有必要切換回休眠一般... –

1
public List<String> getUsers() { 
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL); 
    Result<Record> results = sql.select().from("users").fetch(); 

    return results.getValues(loginFieldIndex); 
} 

,你把返回的請求屬性列表和JSP(如屬性名「用戶」。):

<c:forEach var="u" items="${users}"> 
    ${u} <br /> 
</c:forEach> 
+0

但是,這將返回我只有一列,我需要整個表 –

+0

我誤解了你的問題。對不起 – Robertiano

0

這是頂級的谷歌答案「 jooq jsp「(經過一些實驗),這裏是另一種梳理方式使用JSP進行JOOQ,同時保持JOOQ的類型安全性和性能。

<%@ page isELIgnored="false" %> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<%@ page import="static com.example.jooq.tables.TblCats.*" %> 
<%@ page import="org.jooq.Result, org.jooq.Record" %> 

<h2>Length: ${fn:length(cats)}</h2> 

<c:forEach var="cat" items="${cats}"> 
<% Record cat = (Record) pageContext.getAttribute("cat"); %> 

<%= cat.getValue(TBL_CATS.TITLE) %>, 
<%= cat.getValue(TBL_CATS.POSITION) %> 

<br> 

</c:forEach> 
+0

這看起來很有趣。 'cats'變量來自哪裏? –

0

如果使用JOOQ與JSP了很多,這是值得添加一個ELResolver能理解Record

這裏有一個簡單的實現:https://gist.github.com/dbichko/074641915157ac21996c

然後您需要用JSP引擎進行註冊。在ServletContextListener是一個很好的地方一樣:

public void contextInitialized(ServletContextEvent sce) { 
    ServletContext ctx = sce.getServletContext(); 
    JspFactory.getDefaultFactory() 
     .getJspApplicationContext(ctx).addELResolver(new RecordResolver()); 
} 

有了這一點,你可以使用的記錄字段作爲屬性:

<c:forEach var="user" items="${users}"> 
    ${user.login} <br /> 
</c:forEach>