2

有没有办法Result<Record>从 jOOQ 中循环<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>,或者它是不可能的?

4

5 回答 5

1

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

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

在此处查看相关的 Javadocs:

于 2012-11-26T18:29:21.447 回答
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>
于 2012-11-26T17:05:54.560 回答
0

这是“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>
于 2013-11-22T06:37:20.900 回答
0

如果你经常将JOOQ与 JSP 一起使用,那么添加一个可以理解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>
于 2014-10-03T00:40:15.980 回答
-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();
}

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

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

于 2012-11-26T16:14:35.530 回答