在规范中使用分页

时间:2019-01-21 13:55:19

标签: spring-boot pagination spring-data-jpa specifications

我对分页完全陌生,一无所知。从来没有使用它。有人告诉我,使用“规范”来使用分页和其他东西很容易而且很好。现在,我已经成功实现了我的规范,但是我不知道分页如何工作以及如何将其应用到前端。

通常我有一个列表,显示数据库中的所有内容。但是当我使用分页对象时,我需要有一个Page,所以我将列表更改为Page。

直到现在我一直在尝试:

SearchController:

public class SucheController {
    @Autowired
    private TelefonbuchRepository telefonbuchRepository;
    private Page<Telefonbuch> eintraege;
    private Telefonbuch telefonbuch = new Telefonbuch();

       public void search(String vorname, String nachname, String telefonnummer, String handynummer) {  
            if (!vorname.isEmpty()) {   
                eintraege = telefonbuchRepository.findAll(TelefonbuchSpecifications.hasVorname(vorname), PageRequest.of(0, 5));
            }

我找不到确切的教程,因此我只是尝试通过我的规范和Pagination元素。当我搜索错误时:

javax.el.PropertyNotFoundException: Property [id] not found on type [org.springframework.data.domain.PageImpl]

如何正确执行?您知道与此相关的任何教程或网站吗?我什至不知道我是否可以在前端显示Page对象。我正在将JSF与xhtml文件一起使用。如果您需要更多信息,请告诉我。

enter image description here

编辑: suche.xhtml根据要求:

<p:dataTable id="table" var="telefonbuch" value="#{sucheController.eintraege}" stickyHeader="true" resizableColumns="true" liveResize="true" style="margin-bottom:20px" paginator="true" rows="10" emptyMessage="Keine Telefonbucheinträge vorhanden" selection="#{telefonbuchList.selectedEntry}" selectionMode="single" rowKey="#{telefonbuch.id}"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="10,20,30">

我现在在第一行的结尾看到了telefonbuch.id。

1 个答案:

答案 0 :(得分:0)

通过确保存储库扩展了JpaSpecificationExecutor并调用findAll(Specification, Pageable)方法,您可以正确实施规范

但是,此方法返回一个Page<TelefonBuch>对象,该对象已分配给名为eintraege的字段。从您发布的异常来看,您似乎试图在id之上直接获取名为eintraege的属性,因此我假设您在JSF代码中有类似${eintraege.id}的内容,但该方法不起作用,因为它没有id属性。

您可能想要做的是循环遍历eintraege中的所有对象,并显示每个对象的ID。这意味着您可能需要执行以下操作:

<c:forEach var="telefonbuch" items="#{eintraege.content}">
    <h:outputText  value="#{telefonbuch.id}" />
</c:forEach>

这里发生的是我们在eintraege.getContent()上循环,该循环返回可以迭代的集合。然后,您应该将每个对象分配给一个变量(例如telefonbuch),然后可以调用诸如#{telefonbuch.id}之类的属性。