Hibernate Prime面临惰性过滤问题
我试图在我的应用程序中实现延迟加载,但我的筛选有问题。此时排序工作正常。使用惰性筛选,datatable最初从表中加载正确的计数,即24条记录,但它会一次又一次地重复第一条和第二条记录。非常感谢您的帮助 以下是我的屏幕截图列表生产者类别代码:Hibernate Prime面临惰性过滤问题,hibernate,datatable,primefaces,lazy-loading,filtering,Hibernate,Datatable,Primefaces,Lazy Loading,Filtering,我试图在我的应用程序中实现延迟加载,但我的筛选有问题。此时排序工作正常。使用惰性筛选,datatable最初从表中加载正确的计数,即24条记录,但它会一次又一次地重复第一条和第二条记录。非常感谢您的帮助 以下是我的屏幕截图列表生产者类别代码: @ManagedBean @RequestScoped public class ScreenshotListProducer implements Serializable { private static fin
@ManagedBean
@RequestScoped
public class ScreenshotListProducer implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager em;
private List<Screenshot> screenshots;
private LazyDataModel<Screenshot> lazyModel = null;
private int pageSize = 5;
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageSize() {
return pageSize;
}
@Produces
@Named
public List<Screenshot> getScreenshots() {
System.out.println("************* getting screenshots list **************");
return screenshots;
}
@PostConstruct
public void LoadData() {
lazyModel = new LazyDataModel<Screenshot>() {
private static final long serialVersionUID = 1L;
@Override
public List<Screenshot> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
int start = first;
int end = first + pageSize;
if (sortField == null) {
sortField = "time";
}
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Screenshot> criteria = cb.createQuery(Screenshot.class);
Root<Screenshot> screenshot = criteria.from(Screenshot.class);
// sorting
if (sortOrder.equals(SortOrder.ASCENDING))
{
criteria.select(screenshot).orderBy(cb.asc(screenshot.get(sortField)));
}
else if (sortOrder.equals(SortOrder.DESCENDING))
{
criteria.select(screenshot).orderBy(cb.desc(screenshot.get(sortField)));
}
// From
Root<Screenshot> from = criteria.from(Screenshot.class);
List<Predicate> predicates = new ArrayList<Predicate>();
if (filters != null) {
// filters
for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
String filterProperty = it.next(); // table column name = field name
System.out.println("filterProperty is: " + filterProperty);
String filterValue = filters.get(filterProperty);
System.out.println("filterValue is: " + filterValue);
Expression<String> literal = cb.literal((String)filterValue);
predicates.add(cb.like(from.<String>get(filterProperty), literal));
}
criteria.where(predicates.toArray(new Predicate[predicates.size()]));
}
TypedQuery<Screenshot> s = em.createQuery(criteria);
s.setMaxResults(end - start);
s.setFirstResult(start);
screenshots = s.getResultList();
} catch (NullPointerException e) {
e.printStackTrace();
}
return screenshots;
}
};
lazyModel.setRowCount(24);
lazyModel.setPageSize(pageSize);
if (lazyModel.getRowIndex() == -1 || lazyModel.getPageSize() == 0) {
lazyModel.setRowIndex(-1);
}
else
lazyModel.setRowIndex(lazyModel.getRowIndex() % lazyModel.getPageSize());
}
public LazyDataModel<Screenshot> getLazyModel() {
return lazyModel;
}
}
以下是我的xhtml代码:
<p:dataTable id="table1" var="scrshot" rowKey="#{scrshot.id}" value="#{screenshotListProducer.lazyModel}" paginator="true" rows="7" paginatorPosition="bottom"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="7,20,50,100" widgetVar="dataTable" currentPageReportTemplate="(Number of Records: {totalRecords})"
emptyMessage="No screenshot data found with given criteria" lazy="true" scrollable="true" draggableColumns="true" scrollHeight="217" style="width: 100%;">
<f:facet name="header">
</f:facet>
<p:column selectionMode="multiple"/>
<p:column id="time" headerText="Time" sortBy="#{scrshot.time}" filterBy="#{scrshot.time}" filterMatchMode="startsWith">
<h:outputText value="#{scrshot.time}"/>
</p:column>
<p:column id="id" headerText="ID" sortBy="#{scrshot.id}" filterBy="#{scrshot.id}" filterOptions="#{scrshot.id}" filterMatchMode="exact">
<h:outputText value="#{scrshot.id}"/>
</p:column>
</p:dataTable>
第3.3.1条
莫哈拉2.1.5
JBoss AS 7.1.0.最终版几句话:
- 您正在使用
。我似乎还记得过滤/排序和请求范围方面的问题(不确定这就是问题所在)。请尝试@RequestScoped
或更高的范围@ViewScoped
- 不要在顶层(支持bean)中使用数据访问(例如与数据库相关的东西,如
)。将其分为2或3层:GUI-(业务逻辑)-数据访问EntityManager
- 您发布的
类的缩进混乱,难以阅读。它似乎也没有正确关闭(缺少“}”)ScreenshotListProducer
- JSF中的
似乎没有连接到数据表。(我可能错了。)globalFilter
- 您似乎正在创建3个筛选器、2个列筛选器和1个全局筛选器,是哪一个导致了问题?下次再具体点;-)李>
- 删除不相关的代码并精简代码,以制作一个简短的示例来演示您的问题。示例:
和modeOptions
似乎没有使用,只会影响问题的可读性formatOptions
- 感谢您的投入。我的加入问题与我的“From”定义有关。我把它拿出来,在我的过滤器中使用我原来的“屏幕截图”,现在它可以正常过滤了。我尝试了@ViewScoped,但它似乎没有改变我的结果。很抱歉,缩进等弄乱了。它在键入时看起来很好,但在提交后被弄乱了。我遇到的问题是,在执行任何筛选之前加载页面时,初始datatable加载发生了,但这是在插入示例中概述的筛选代码之后发生的。很抱歉,示例包含的内容超出了需要的内容。我试图把它缩短一点,但有些部分被忽略了。我的hibernate语句似乎是在添加过滤代码后尝试进行“连接”,如果不添加该代码,我就看不到这一点。如有其他建议,我们将不胜感激。谢谢你的建议!
<p:dataTable id="table1" var="scrshot" rowKey="#{scrshot.id}" value="#{screenshotListProducer.lazyModel}" paginator="true" rows="7" paginatorPosition="bottom"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="7,20,50,100" widgetVar="dataTable" currentPageReportTemplate="(Number of Records: {totalRecords})"
emptyMessage="No screenshot data found with given criteria" lazy="true" scrollable="true" draggableColumns="true" scrollHeight="217" style="width: 100%;">
<f:facet name="header">
</f:facet>
<p:column selectionMode="multiple"/>
<p:column id="time" headerText="Time" sortBy="#{scrshot.time}" filterBy="#{scrshot.time}" filterMatchMode="startsWith">
<h:outputText value="#{scrshot.time}"/>
</p:column>
<p:column id="id" headerText="ID" sortBy="#{scrshot.id}" filterBy="#{scrshot.id}" filterOptions="#{scrshot.id}" filterMatchMode="exact">
<h:outputText value="#{scrshot.id}"/>
</p:column>
</p:dataTable>