[英]Loop through Result<Record> from jOOQ in <c:forEach>
有没有办法在<c:forEach>
jOOQ中遍历Result<Record>
<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>
进行遍历,或者是否不可能?
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>
似乎您希望像记录一样对记录进行操作。 这是使用jOOQ实现此目标的方法:
public List<Map<String, Object>> getUsers() {
Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL);
return sql.select().from("users").fetchMaps();
}
请在此处查看相关的Javadocs:
这是Google对“ jooq jsp”的最佳答案,因此(经过一些试验)这是将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>
如果您经常将JOOQ与JSP结合使用,则值得添加一个能理解Record
的ELResolver 。
这是一个简单的实现: 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>
我将使用像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,但它似乎有一个行映射系统。 如果您想坚持使用RecordHandler
,请尝试创建一个RecordHandler
并使用fetchInto()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.