fragment中的DataGrid,点击分页表格中的数据不改变

项目版本:2.3.1

问题:点击10次下一页,页面的内容可能也就会加载3次,其余的7次的内容是不变的,数据库中的数据是没问题的。不止这一个fragment有问题

image

fragment中的datagrid使用的数据源是外部提供的还是fragment自带的?

在fragment中的onHostBeforeShow()方法中用下面的方式查询的

Dl.setQuery(sql.toString());
Dl.setParameters(paramMap);
Dl.load();

我试了试,没有重现你的问题:
dg

fragment xml:

<fragment xmlns="http://jmix.io/schema/flowui/fragment">
    <data>
        <collection id="productsDc" class="com.company.jmix2sample.entity.Product">
            <fetchPlan extends="_base"/>
            <loader id="productsDl" readOnly="true"/>
        </collection>
    </data>
    <content>
        <vbox id="root">
            <hbox id="buttonsPanel" classNames="buttons-panel">
                <simplePagination id="pagination" dataLoader="productsDl" itemsPerPageVisible="true"
                                  itemsPerPageItems="2,4,6"/>
            </hbox>
            <dataGrid id="productsDataGrid" dataContainer="productsDc" minWidth="100px" width="100%">
                <actions>
                    <action id="create" type="list_create"/>
                    <action id="edit" type="list_edit"/>
                    <action id="remove" type="list_remove"/>
                </actions>
                <columns>
                    <column property="name"/>
                    <column property="status"/>
                    <column property="inStock"/>
                    <column property="stockNum"/>
                    <column property="stockPosition"/>
                </columns>
            </dataGrid>
        </vbox>
    </content>
</fragment>

fragment controller:

@FragmentDescriptor("product-list-fragment.xml")
public class ProductListFragment extends Fragment<VerticalLayout> {
    @ViewComponent
    private CollectionLoader<Product> productsDl;

    @Subscribe(target = Target.HOST_CONTROLLER)
    public void onHostBeforeShow(final View.BeforeShowEvent event) {
        productsDl.setQuery("select p from jmx2sp_Product p");
        productsDl.load();
    }
}

我这里是这样的
recording

fragment xml:

<fragment xmlns="http://jmix.io/schema/flowui/fragment">
    <data>
        <collection id="inWingDc" class="xxxx.InWingBasic">
            <fetchPlan extends="_base"/>
            <loader id="inWingDl" readOnly="true">
<!--                <query>-->
<!--                    <![CDATA[select e from InWingBasic e where e.weeklyDetail.id like :weeklyDetail or e.weeklyMst.id like :weeklyMst]]>-->
<!--                </query>-->
            </loader>
        </collection>
    </data>
    <content>
        <vbox id="inWingVbox" css="border:1px solid #dbdfe4; border-radius: 10px;">
            <nativeLabel text="msg://xxx/InWingBasic"/>
            <hbox id="inWingButtonsPanel" classNames="buttons-panel">
                <button id="createInWingBtn" action="inWingDataGrid.create"/>
                <button id="editInWingBtn" action="inWingDataGrid.edit"/>
                <button id="removeInWingBtn" action="inWingDataGrid.remove"/>
                <button id="pullDataBtn" action="inWingDataGrid.pullData"/>
            </hbox>
            <dataGrid id="inWingDataGrid"
                      dataContainer="inWingDc"
                      width="100%"
                      columnReorderingAllowed="true"
                      themeNames="row-stripes column-borders"
                      allRowsVisible="true"
                      maxHeight="25em"
                      minHeight="150px">
                <actions>
                    <action id="create" type="list_create">
                        <properties>
                            <property name="openMode" value="DIALOG"/>
                        </properties>
                    </action>
                    <action id="edit" type="list_edit">
                        <properties>
                            <property name="openMode" value="DIALOG"/>
                        </properties>
                    </action>
                    <action id="remove" type="list_remove"/>
                    <action id="pullData" text="msg:///pullData"/>
                </actions>
                <columns resizable="true">
                    ......
                    <column property="dataDate" autoWidth="true"/>
                    ......
                    <column property="decayRate" autoWidth="true"/>
                    <column property="installDate" autoWidth="true"/>
                    <column property="dataSource" autoWidth="true"/>
                </columns>
            </dataGrid>
            <hbox classNames="buttons-panel">
                <simplePagination id="inWingPagination" dataLoader="inWingDl"
                                  itemsPerPageVisible="true"
                                  itemsPerPageDefaultValue="10"
                                  itemsPerPageItems="10, 20, 30, 50"/>
            </hbox>
        </vbox>
    </content>
</fragment>

fragment controller:

@Subscribe(target = Target.HOST_CONTROLLER)
public void onHostBeforeShow(final View.BeforeShowEvent event) {
    StringBuilder sql = new StringBuilder("select e from InWingBasic e where 1 = 1");
    Map<String, Object> paramMap = new HashMap<>();
    if (weeklyDetail != null) {
        sql.append(" AND e.weeklyDetail.id = :weeklyDetail");
        paramMap.put("weeklyDetail", weeklyDetail.getId());
    } else {
        sql.append(" AND e.weeklyMst.id = :weeklyMst");
        paramMap.put("weeklyMst", weeklyMst.getId());
    }
    sql.append(" order by e.xxx, e.xxx");
    inWingDl.setQuery(sql.toString());
    inWingDl.setParameters(paramMap);
    inWingDl.load();
    if (!hasLineNumber) {
        dataGridService.addIndexColumn(inWingDataGrid, inWingDc);
        hasLineNumber = true;
    }
}

你点的太快了。每点一下翻页都要执行一个sql,如果前一个sql没执行完,又点一下,可能就不会刷新数据。点击翻页时可以看看后台有没有类似输出:
image

注意需要修改这个配置才能看到sql:

logging.level.eclipselink.logging.sql = debug

好 我试一下

我看了一下控制台的sql,在数据库里面复现了一下,查的有问题,最后面的那两个分页,查询出来的数据是一样的,但是我数据库里的数据是没问题的,都是不同的数据
image

找到原因了,是因为我根据其中的某两个字段查询,但是这两个字段重复的数据很多,所以导致每次都是根据这两个字段进行排序后展示,所以永远展示的都是那10条数据

1 个赞