【问题标题】:Loop through Result<Record> from jOOQ in <c:forEach>循环遍历 <c:forEach> 中 jOOQ 的 Result<Record>
【发布时间】:2012-11-14 03:32:32
【问题描述】:

有没有办法在&lt;c:forEach&gt; 中循环从jOOQ 中的Result&lt;Record&gt;

这里是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();
}

但如前所述,我不知道如何在&lt;c:forEach&gt; 中循环遍历它,或者不可能?

【问题讨论】:

    标签: java jsp jstl jooq


    【解决方案1】:

    您似乎想对记录进行操作,就好像它们是地图一样。以下是使用 jOOQ 实现此目的的方法:

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

    在此处查看相关的 Javadocs:

    【讨论】:

    • 谢谢,这正是我想要的。必须更仔细地阅读手册
    【解决方案2】:
    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);
    }
    

    然后你将返回的 List 放入请求属性(例如属性名称“users”)和 jsp 中:

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

    【讨论】:

    • 但这只会返回一列,我需要整张桌子
    • 我误解了你的问题。对不起
    【解决方案3】:

    这是“jooq jsp”的最佳 Google 答案,因此(经过一些实验)这是将 JOOQ 与 JSP 相结合的另一种方式,同时保留了 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>
    

    【讨论】:

    • 这看起来确实很有趣。 cats 变量来自哪里?
    【解决方案4】:

    如果你经常使用 JOOQ 和 JSP,那么值得添加一个可以理解 RecordELResolver

    这是一个简单的实现: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>
    

    【讨论】:

      【解决方案5】:

      我会使用像 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();
      }
      

      显然有很多设置等可以将 Hibernate 带入您的项目,但我认为好处超过了。

      编辑:我不认为 JOOQ 可以做 ORM,但它似乎有一个行映射系统。如果您想坚持使用 JOOQ,请尝试创建 RecordHandler 并使用 fetchInto() 方法。

      【讨论】:

      猜你喜欢
      • 2012-10-15
      • 2012-12-12
      • 2014-03-31
      • 2020-08-23
      • 2011-02-23
      • 1970-01-01
      • 2020-11-17
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多