【问题标题】:Issue rendering JPQL custom query results into a JSF page将 JPQL 自定义查询结果呈现到 JSF 页面中的问题
【发布时间】:2011-07-24 13:07:15
【问题描述】:

我有一个具有以下命名查询的实体:

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description, g.uploadDate FROM Garbage g;")

问题是我想将该结果传递给 dataTable 进行渲染,并且我收到 NumberFormatException。我不明白为什么,因为任何地方都没有数字。

程序的其余部分如下所示:

-执行查询的 EJB

@Stateless(name = "ejbs/SearchEJB")
public class SearchEJB implements ISearchEJB {

@PersistenceContext
private EntityManager em;


public List<Garbage> findAllGarbage() {
    Query query = em.createNamedQuery("findAllGarbage");    
    List<Garbage> tmpGarbage = query.getResultList();
    return tmpGarbage;
}

-显示tableData的JSF部分:

<p:dataTable var="garbage" value="#{resultsController.allGarbage}" paginator="true" rows="10"  
             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
             rowsPerPageTemplate="5,10,15">         

            <p:column>  
            <f:facet name="header">  
            <h:outputText value="Filename" />  
            </f:facet>  
            <h:outputText value="#{garbage.filename}" />
             </p:column> 

            <p:column>  
            <f:facet name="header">  
            <h:outputText value="Description" />  
            </f:facet>  
            <h:outputText value="#{garbage.description}" />  
             </p:column> 

            <p:column>  
            <f:facet name="header">  
            <h:outputText value="Upload date" />  
            </f:facet>  
            <h:outputText value="#{garbage.uploadDate}" /> 
             </p:column>                
    </p:dataTable> 

-与JSF页面交互的托管bean:

@ManagedBean
@RequestScoped
public class ResultsController {

@EJB
private ISearchEJB searchEJB;

private Garbage garbage;

public List<Garbage> getAllGarbage() {
    return searchEJB.findAllGarbage();
}

public Garbage getGarbage() {
    return garbage;
}

public void setGarbage(Garbage garbage) {
    this.garbage = garbage;
}

错误提示:

警告: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet 抛出异常 java.lang.NumberFormatException:对于输入字符串:“文件名”

我不明白文件名有什么问题。

----------------------更新---------- --------------------------

我将 JSF 更改为此,现在我没有看到错误。我看到表格数据但为空:

<p:dataTable var="garbage" value="#{resultsController.allGarbage}" paginator="true" rows="10"  
         paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
         rowsPerPageTemplate="5,10,15">         

        <p:column>  
        <f:facet name="header">  
        <h:outputText value="Filename" />  
        </f:facet>  
        <h:outputText value="#{garbage[4]}" />
         </p:column> 

        <p:column>  
        <f:facet name="header">  
        <h:outputText value="Description" />  
        </f:facet>  
        <h:outputText value="#{garbage[3]}" />  
         </p:column> 

        <p:column>  
        <f:facet name="header">  
        <h:outputText value="Upload date" />  
        </f:facet>  
        <h:outputText value="#{garbage[6]}" /> 
         </p:column>                
</p:dataTable> 

【问题讨论】:

    标签: java jsf jpa jakarta-ee jpql


    【解决方案1】:

    问题是由诸如

    之类的查询引起的
    SELECT g.filename, g.description, g.uploadDate FROM Garbage
    

    返回一个Object[],其中包含文件名、描述和uploadDate 作为其元素。

    如果您想以对象属性的形式访问它们(就像在 JSF 中所做的那样),您需要查询完整的对象:

    SELECT g FROM Garbage g
    

    【讨论】:

    • 这不是一个选项,因为它也会检索文件本身。这会减慢性能。每个文件可以是几兆。我需要以某种方式从查询中排除一个名为 byte[] 类型的文件的变量
    • @sfrj:那么您需要在视图中使用数组索引而不是字段名称(我不确定它在 JSF 中如何工作)。
    • 我的想法是尝试按照您所说的去做:从垃圾 g 中选择 g 并尝试添加类似 EXCEPT g.file 之类的内容,但这没有用。我不知道山楂数组索引如何工作。还有其他选择吗?我只需要没有属性文件的垃圾对象。
    • @sfrj:你有没有试过写#{garbage[0]}而不是#{garbage.filename}等等?
    • 这个应该可以。为了编译时的一致性,您还希望在您的 bean 代码中将 List&lt;Garbage&gt; 替换为 List&lt;Object[]&gt;
    猜你喜欢
    • 2020-11-14
    • 2021-10-13
    • 2018-08-18
    • 2011-08-23
    • 2017-12-17
    • 1970-01-01
    • 2012-08-15
    • 2012-07-30
    • 2014-03-19
    相关资源
    最近更新 更多