Ошибка рендеринга результатов пользовательских запросов JPQL на страницу JSF - PullRequest
1 голос
/ 28 марта 2011

У меня есть объект со следующим именованным запросом:

@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;
}

- Часть 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:

@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 () для сервлета Faces Servlet вызвала исключение java.lang.NumberFormatException: Для входной строки: «filename»

Я не понимаю, чтоневерно с именем файла.

------------------------------------ ОБНОВЛЕНИЕ------------------------------------

Я изменил 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> 

1 Ответ

2 голосов
/ 28 марта 2011

Проблема вызвана тем, что запрос, такой как

SELECT g.filename, g.description, g.uploadDate FROM Garbage

, возвращает Object[] с именем файла, описанием и uploadDate в качестве его элементов.

Если вы хотите получить доступих как свойства объекта (как в JSF), вместо этого вам нужно запросить полный объект:

SELECT g FROM Garbage g
...