我使用的是JDeveloper版本:11.1.2.0.0
在一个jsff的页面中,我有一个af:query组件。查询组件连接到如下表:
<af:query .../>
<af:table .../>
当我转到不在同一个有界任务流中的页面然后再返回到原始页面时,将清除输入到查询中的所有值。有什么好办法可以阻止这种情况吗?我认为查询值将存储在视图对象实例中,但可能并非如此。
当我使用唯一的表但过滤时,过滤器中的值会在我向后导航时停留。
我尝试了一些事情,例如尝试将Querydescriptor存储在bean中但无法使其工作。
这是我用来在用户进行搜索时获取值的代码:
/**Custom Query Listener-Using QueryDescriptor
* @param queryEvent
*/
public void customQueryProcess(QueryEvent queryEvent) {
QueryDescriptor qd = queryEvent.getDescriptor();
ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
//access the list of search fields
List<Criterion> criterionList = conCrit.getCriterionList();
//iterate over the attributes to find FromDate and ToDate
for (Criterion criterion : criterionList) {
AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();
String name = attrDescriptor.getName();
String value = (String)((AttributeCriterion)criterion).getValues().get(0);
queryValues.put(name, value);
}
/**Process default query listener*/
Context.invokeEL("#{bindings.FlettefeltVCQuery.processQuery}", new Class[] { QueryEvent.class },
new Object[] { queryEvent });
}
现在的问题是当用户返回页面时如何应用保存的值?我试图在我的bean中引入一个自定义值属性,我在其中更改值。这导致了奇怪的行为。在我的表中,我获得了特定查询的严格行数,但它们是“行”行。它们似乎只是表格中的第一行。这是我尝试过的代码:
public QueryDescriptor getCustomQueryDescriptor() {
QueryDescriptor query = (QueryDescriptor)Context.evaluateEL("#{bindings.FlettefeltVCQuery.queryDescriptor}");
ConjunctionCriterion conCrit = query.getConjunctionCriterion();
List<Criterion> criterionList = conCrit.getCriterionList();
for (Criterion criterion : criterionList) {
AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();
String name = attrDescriptor.getName();
AttributeCriterion ac = (AttributeCriterion)criterion;
if (queryValues.containsKey(name)) {
List values = ac.getValues();
values.clear();
values.set(0, queryValues.get(name));
}
}
return query;
}
答案 0 :(得分:1)
答案 1 :(得分:1)
我找到了解决问题的解决方案。解决方案的关键是将绑定层中搜索区域上的属性 InitialQueryOverridden 设置为 true 。这会在每次输入页面时停止执行查询。但是,如果查询自动在视图条件上设置为 true ,它将在第一次在会话中输入页面时执行查询。
这解决了表中行的问题。他们现在离开并进入页面时不会改变。但是,查询中的值消失了。为了解决这个问题,我在会话bean中编写了以下代码。
public void customQueryProcess(QueryEvent queryEvent) {
qd = queryEvent.getDescriptor();
ConjunctionCriterion conCrit = qd.getConjunctionCriterion();
//access the list of search fields
List<Criterion> criterionList = conCrit.getCriterionList();
//iterate over the attributes to find FromDate and ToDate
for (Criterion criterion : criterionList) {
AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();
String name = attrDescriptor.getName();
Object value = ((AttributeCriterion)criterion).getValues().get(0);
queryValues.put(name, value);
}
/**Process default query listener*/
Context.invokeEL("#{bindings.FlettefeltVCQuery.processQuery}", new Class[] { QueryEvent.class },
new Object[] { queryEvent });
}
public QueryModel getCustomQueryModel() {
System.out.println("getCustomQueryModel");
QueryModel model = (QueryModel)Context.evaluateEL("#{bindings.CustomersVCQuery.queryModel}");
List<QueryDescriptor> systemQueries = model.getSystemQueries();
for(QueryDescriptor query : systemQueries){
ConjunctionCriterion conCrit = query.getConjunctionCriterion();
List<Criterion> criterionList = conCrit.getCriterionList();
for (Criterion criterion : criterionList) {
AttributeDescriptor attrDescriptor = ((AttributeCriterion)criterion).getAttribute();
String name = attrDescriptor.getName();
AttributeCriterion ac = (AttributeCriterion)criterion;
if(queryValues.containsKey(name)){
List values = ac.getValues();
values.clear();
values.set(0, queryValues.get(name));
}
}
}
return model;
}
代码通过以下方式连接到我的jsff文件中的查询组件:
<af:query id="qryId1" headerText="My query" disclosed="true"
model="#{myQueryBean.customQueryModel}"
queryListener="#{myQueryBean.customQueryProcess}"
queryOperationListener="#{bindings.CustomersVCQuery.processQueryOperation}"
resultComponentId="::resId1" saveQueryMode="hidden"
value="#{bindings.CustomersVCQuery.queryDescriptor}"/>