使用 ui:repeat 访问本机查询列表

Posted

技术标签:

【中文标题】使用 ui:repeat 访问本机查询列表【英文标题】:accessing native query list using ui:repeat 【发布时间】:2013-05-03 04:42:04 【问题描述】:

假设我有一个表 test 与列 idname

在我的 bean 上我得到了这个查询

public List getTestList()
  Query q = em.createNativeQuery("select * from test");
  List list = q.getResultList();
  return list;

在我的 jsf 页面上,我有:

<ul>
    <ui:repeat id="resulta" value="#testController.testList" var="item"> 
        <li>#item.id</li>
    </ui:repeat>
</ul>

为什么我会收到SEVERE: javax.el.ELException: /test.xhtml: For input string: "id"

【问题讨论】:

【参考方案1】:

为什么我得到一个 SEVERE: javax.el.E​​LException: /test.xhtml: For input string: "id"

因为本机查询返回 List&lt;Object[]&gt;,而不是 List&lt;Test&gt;。您基本上是在尝试使用诸如"id" 之类的字符串而不是诸如0 之类的整数来访问Object[] 数组。如果您仔细观察堆栈跟踪,那么您应该已经注意到在异常之后堆栈中的ArrayELResolver 存在一点,这应该已经暗示#item 实际上被解释为一个数组。

因此,如果您绝对无法将其作为完整的 List&lt;Test&gt; (you can easily do inner joins using @ManyToOne and so on) 获取,那么应该这样做以从 SELECT 查询中获取第一列:

<li>#item[0]</li>

【讨论】:

【参考方案2】:

SELECT 子句查询多个列或实体,结果 在 java.util.List 中的对象数组 (Object[]) 中聚合 由 getResultList() 返回。

首先,您的情况不需要本机查询。本机查询的结果返回一个对象数组列表。您必须创建 JPQL 查询而不是本机查询。

Query q = em.createQuery("select t from Test t", Test.class);
List<Test> list = q.getResultList();

【讨论】:

嗨,实际上我需要它是 nativeQuery,因为我需要类似 "select t.*,nt.name from test as t Inner Join newTest as nt" @galao 尝试描述你的实际问题,它误导人们,浪费双方时间。类似的,可以参考这里-***.com/a/4536802/366964

以上是关于使用 ui:repeat 访问本机查询列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSF ui:repeat 循环执行带状态的逻辑

在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用

如何使用 <f:ajax render> 重新渲染 <ui:repeat>

使用 ui:repeat 输出 ResultSet

有条件地渲染 tr,使用 ui:repeat 构建表

如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表