Thymeleaf 视图找不到 property/field 的 jOOQ 连接查询
Thymeleaf view can't find property/field of jOOQ join query
我刚开始使用 Spring、Thymeleaf 和 jOOQ。我想在概览中显示数据库查找的结果。当我只查询 select().from(CONFIGURATIONS) 时,Thymeleaf 视图工作得很好。但是当我想加入用户 table 以将用户名添加到结果中而不仅仅是 ID 时,我收到一个错误。
这是网络浏览器中的错误:
Mon Oct 10 16:04:17 CEST 2016
There was an unexpected error (type=Internal Server Error, status=500).
Exception evaluating SpringEL expression: "config.name" (overview:37)
这是 Eclipse 中的错误:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 7): Property or field 'name' cannot be found on object of type 'org.jooq.impl.RecordImpl' - maybe not public?
我知道我的视图代码是错误的,但我不知道我应该把 "config.name" 改成什么才能得到正确的 property.field。
这是我的控制器:
@Controller
public class OverviewController
{
public ArrayList configurationList = new ArrayList();
@RequestMapping("/overview")
public String showConfigurationList(Model model)
{
model.addAttribute("configs", getConfigurations());
return "overview";
}
public ArrayList getConfigurations()
{
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword))
{
DSLContext create = DSL.using(conn, SQLDialect.POSTGRES_9_5);
Result<Record5<String, String, Timestamp, String, String>> result = create.select(CONFIGURATION.NAME, CONFIGURATION.VERSION, CONFIGURATION.DATE_MODIFIED, CONFIGURATION.AUTHOR_USER_ID, USER.NAME)
.from(USER).join(CONFIGURATION)
.on(CONFIGURATION.AUTHOR_USER_ID.equal(USER.ID)))
.fetch();
/*Result<Record> result = create.select()
.from(CONFIGURATION)
.fetch();*/
if(configurationList.isEmpty() == true)
{
for (Record5 r : result) {
configurationList.add(r);
}
}
}
catch (Exception e)
{
System.out.println("ERROR: " + e);
}
return configurationList;
}
这是 Thymeleaf 视图:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Nazza Mediator - Overview</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
<script src="http://code.jquery.com/jquery.js" />
<script src="webjars/bootstrap/3.3.7-1/js/bootstrap.min.js" />
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/">Nazza Mediator</a>
</div>
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li class="active"><a href="/overview">Configuration Overview</a></li>
</ul>
</div>
</nav>
<h3>Configuration Overview</h3>
<table class="table table-hover">
<tr>
<th>NAME</th>
<th>VERSION</th>
<th>DATE MODIFIED</th>
<th>AUTHOR</th>
</tr>
<tr th:each="config : ${configs}">
<td th:text="${config.name}"></td>
<td th:text="${config.version}"></td>
<td th:text="${config.dateModified}"></td>
<td th:text="${config.authorUserId}"></td>
</tr>
</table>
</body>
</html>
我假设你已经安装了 jOOQ 代码生成器并且 运行。
因此,当您使用第一个 select
Result<Record> result = create.select()
.from(CONFIGURATION)
.fetch();
你实际上会得到 Result<ConfigurationRecord>
并且那个有一个访问器 getName
可以被 Thymeleaf 使用。
如果您写下连接并手动添加字段,您将拥有一个通用记录,一个仅提供 #get(String fieldName)
和其他一些的实现。
在您看来,您必须按如下方式更改对值的访问权限
<td th:text="${config.get('NAME')}"></td>
您必须为每个字段执行此操作。
但请注意,在您的查询中有两个字段名为 "name",我想您应该为其中之一设置别名。例如,USER.NAME.as('userName')
并在对 get 的调用中使用它。
如果有帮助请告诉我。
另一个编辑:来自 jOOQ 的 Lukas Eder 询问是否可以使用 config['NAME']
:这对于通用记录是不可能的,但对于特定记录也是如此。此外,在引用字段名称的所有情况下,您都必须小心,因为它区分大小写。
我刚开始使用 Spring、Thymeleaf 和 jOOQ。我想在概览中显示数据库查找的结果。当我只查询 select().from(CONFIGURATIONS) 时,Thymeleaf 视图工作得很好。但是当我想加入用户 table 以将用户名添加到结果中而不仅仅是 ID 时,我收到一个错误。
这是网络浏览器中的错误:
Mon Oct 10 16:04:17 CEST 2016 There was an unexpected error (type=Internal Server Error, status=500). Exception evaluating SpringEL expression: "config.name" (overview:37)
这是 Eclipse 中的错误:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 7): Property or field 'name' cannot be found on object of type 'org.jooq.impl.RecordImpl' - maybe not public?
我知道我的视图代码是错误的,但我不知道我应该把 "config.name" 改成什么才能得到正确的 property.field。
这是我的控制器:
@Controller
public class OverviewController
{
public ArrayList configurationList = new ArrayList();
@RequestMapping("/overview")
public String showConfigurationList(Model model)
{
model.addAttribute("configs", getConfigurations());
return "overview";
}
public ArrayList getConfigurations()
{
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword))
{
DSLContext create = DSL.using(conn, SQLDialect.POSTGRES_9_5);
Result<Record5<String, String, Timestamp, String, String>> result = create.select(CONFIGURATION.NAME, CONFIGURATION.VERSION, CONFIGURATION.DATE_MODIFIED, CONFIGURATION.AUTHOR_USER_ID, USER.NAME)
.from(USER).join(CONFIGURATION)
.on(CONFIGURATION.AUTHOR_USER_ID.equal(USER.ID)))
.fetch();
/*Result<Record> result = create.select()
.from(CONFIGURATION)
.fetch();*/
if(configurationList.isEmpty() == true)
{
for (Record5 r : result) {
configurationList.add(r);
}
}
}
catch (Exception e)
{
System.out.println("ERROR: " + e);
}
return configurationList;
}
这是 Thymeleaf 视图:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Nazza Mediator - Overview</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
<script src="http://code.jquery.com/jquery.js" />
<script src="webjars/bootstrap/3.3.7-1/js/bootstrap.min.js" />
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/">Nazza Mediator</a>
</div>
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li class="active"><a href="/overview">Configuration Overview</a></li>
</ul>
</div>
</nav>
<h3>Configuration Overview</h3>
<table class="table table-hover">
<tr>
<th>NAME</th>
<th>VERSION</th>
<th>DATE MODIFIED</th>
<th>AUTHOR</th>
</tr>
<tr th:each="config : ${configs}">
<td th:text="${config.name}"></td>
<td th:text="${config.version}"></td>
<td th:text="${config.dateModified}"></td>
<td th:text="${config.authorUserId}"></td>
</tr>
</table>
</body>
</html>
我假设你已经安装了 jOOQ 代码生成器并且 运行。
因此,当您使用第一个 select
Result<Record> result = create.select()
.from(CONFIGURATION)
.fetch();
你实际上会得到 Result<ConfigurationRecord>
并且那个有一个访问器 getName
可以被 Thymeleaf 使用。
如果您写下连接并手动添加字段,您将拥有一个通用记录,一个仅提供 #get(String fieldName)
和其他一些的实现。
在您看来,您必须按如下方式更改对值的访问权限
<td th:text="${config.get('NAME')}"></td>
您必须为每个字段执行此操作。
但请注意,在您的查询中有两个字段名为 "name",我想您应该为其中之一设置别名。例如,USER.NAME.as('userName')
并在对 get 的调用中使用它。
如果有帮助请告诉我。
另一个编辑:来自 jOOQ 的 Lukas Eder 询问是否可以使用 config['NAME']
:这对于通用记录是不可能的,但对于特定记录也是如此。此外,在引用字段名称的所有情况下,您都必须小心,因为它区分大小写。