Функция dataBable sortBy не работает (простые лица) - PullRequest
2 голосов
/ 29 марта 2011

У меня проблема с компонентом dataTable простых лиц. Я не знаю, почему он не закорачивает данные в таблице, когда я нажимаю на нее.

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

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

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

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

Это управляемый компонент

@ManagedBean
@RequestScoped
public class ResultsController {

@EJB
private ISearchEJB searchEJB;

private Garbage[] garbage;

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

public Garbage[] getGarbage() {
    System.out.println("VALUES!!!!!!!!" + garbage[0].getFilename());
    return garbage;
}

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

}

Это EJB, который обеспечивает доступ к данным

@Stateless(name = "ejbs/SearchEJB")

открытый класс SearchEJB реализует ISearchEJB {

@PersistenceContext
private EntityManager em;


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

}

А это сущность (представление данных)

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description,  g.uploadDate FROM Garbage g;")
    @Entity
    public class Garbage {
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Column(nullable = false)
private String filename;
@Column(nullable = false)
private String fileType;
@Column(nullable = false)
private String uploadDate;
@Column(nullable = false)
private String destroyDate;
@Lob
@Column(nullable = false)
private byte[] file;
@Column(nullable = false)
private String description;
...//Getters and Setters

Как показано на рисунке, при нажатии кнопок сортировки изменений нет: enter image description here

Вот что говорит консоль:

SEVERE: ошибка в сортировке

UPDATE

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

    List<Garbage> gList = new ArrayList();

    for (Object o: query.getResultList()) {         
      Garbage tmpG = new Garbage();
      tmpG.setFilename(((Garbage) o).getFilename());          
      tmpG.setUploadDate(((Garbage) o).getUploadDate());
      tmpG.setDescription(((Garbage) o).getDescription());

      gList.add(tmpG);
    }
    return  gList;
}

Модифицированный управляемый компонент

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

}

Модифицированный JSF

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

            <p:column sortBy="#{garbage.filename}" parser="string">  
            <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 sortBy="#{garbage.uploadDate}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Upload date" />  
            </f:facet>  
            <h:outputText value="#{garbage.uploadDate}" /> 
             </p:column>                
    </p:dataTable> 

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Из учебника Java EE Я прочитал следующее:

Типы возврата

Тип возврата предложения SELECT определяется типами результатов выберите выражения, содержащиеся в Это. Если используется несколько выражений, Результатом запроса является Объект [] и элементы в массив соответствует порядку выражения в предложении SELECT, и по типу к типу результата каждого выражение.

Теперь ваш запрос выглядит так:

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

Из вашего класса сущностей Garbage Я прочитал, что filename, description, uploadDate - это строки. Затем ваш запрос возвращает список Object[], и каждый элемент массива содержит строку, а не объект Garbage.

Если ваш массив содержит строки, а не мусор, вы не можете вызвать garbage[0].filename в своем лицевом стекле.

Попробуйте изменить запрос следующим образом:

SELECT g FROM Garbage g;

Тогда вы получите List<Garbage>. В SearchEJB измените сигнатуру метода следующим образом:

public List<Garbage> findAllGarbage()

Измените методы в вашем управляемом бине ResultsController соответственно (теперь вам всегда нужно List<Garbage>, а не List<Garbage[]>).

Наконец, измените ваш p:dataTable (показан для первого столбца):

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

UPDATE:

Если вы хотите сохранить свой запрос, вы можете преобразовать Object[] в список Garbage объектов и оставить пропущенные поля пустыми. Примерно так (добавьте конструктор к вашему классу мусора):

List<Garbage> gList = new ArrayList();

for (Object[] o: query.getResultList()) {
  gList.add(new Garbage(o[0], o[1], o[2]);
}

ОБНОВЛЕНИЕ 2:

В вашем обновлении вы снова пропустили, что ваш массив содержит строки. И строки упорядочены так, как упорядочено ваше выражение выбора: элемент 0: имя файла, элемент 1: описание, элемент 2: uploadDate.

Измените ваш цикл следующим образом:

for (Object o: query.getResultList()) {         
      Garbage tmpG = new Garbage();
      tmpG.setFilename(o[0]);          
      tmpG.setDescription(o[1]);
      tmpG.setUploadDate(o[2]);

      gList.add(tmpG);
    }
0 голосов
/ 03 июня 2014

Я знаю, что об этом спрашивали 3 года назад, но я дам вам свое решение на тот случай, если кто-то наткнется на это.

По сути, нужно вызвать метод findAll () дляваши данные внутри конструктора.Но поскольку EJB-фасад внедряется после конструирования, вы не можете вызвать метод findAllGarbage () внутри конструктора.Вы можете сделать это в методе, аннотированном @PostConstruct:

@PostConstruct
public void myInitMethod(){
   garbage = searchEJB.findAllGarbage();
}

Также: вызов метода findAllGarbage () в получателе сбрасывает данные, и функция сортировки не будет иметь никакого эффекта.Поэтому, возможно, удалите этот метод из получателя и переместите логику findAll в другое место, например, для действия кнопки в случае добавления данных в таблицу.

Подробнее о внедрении EJB здесь: ejbFacade равен нулю

...