Seam issue (is it a bug?) with Entity query when adding order by clause
valatharv Nov 5, 2008 7:47 PMI am facing issue with Entity query when adding order by clause. not sure I should change anything else or it is a bug.
ver : jboss-4.2.3, jboss-seam-2.0.2.SP1
ExperimentTableIndexList.java returns experiment details.
Corresponding xhtml page (ExperimentTableIndexList.xhtml) works fine using default getEjbql without any order by clause
i.e. I can search or sort rich:dataTable without any error.
When I add order by clause in "getEjbql()" as below, and try to search or sort rich:dataTable on the basis of experiment name, it gives error as:
"javax.el.ELException: /ExperimentTableIndexList.xhtml @50,73 rendered="#{empty experimentTableIndexList.resultList}": Error reading 'resultList' on type com.novartis.bdm.proteomics.session.ExperimentTableIndexList_$$_javassist_3" which is
"<h:outputText value="The Experiment Table Index search returned no results."
rendered="#{empty experimentTableIndexList.resultList}"/>"
ExperimentTableIndexList.java
-----------------------------
@Name("experimentTableIndexList")
public class ExperimentTableIndexList extends EntityQuery {
private static final String[] RESTRICTIONS = {
"lower(experimentTableIndex.experimentName) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.experimentName}),'%')",
"lower(experimentTableIndex.experimentTableName) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.experimentTableName}),'%')",
"lower(experimentTableIndex.dateCreated) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.dateCreated}),'%')",
"lower(experimentTableIndex.protXml) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.protXml}),'%')",};
private ExperimentTableIndex experimentTableIndex = new ExperimentTableIndex();
@Override
public String getEjbql() {
//return "select experimentTableIndex from ExperimentTableIndex experimentTableIndex"; //THIS WORKS
return "select experimentTableIndex from ExperimentTableIndex experimentTableIndex ORDER BY experimentTableIndex.experimentName";
}
/**@Override
public Integer getMaxResults() {
return 25;
}**/
public ExperimentTableIndex getExperimentTableIndex() {
return experimentTableIndex;
}
@Override
public List<String> getRestrictions() {
return Arrays.asList(RESTRICTIONS);
}
}
ExperimentTableList.xhtml
-------------------------
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" id="globalMessages"/>
<h:form id="experimentTableIndexSearch" styleClass="edit">
<rich:simpleTogglePanel label="ExperimentTableIndex search parameters" switchType="ajax">
<s:decorate template="layout/display.xhtml">
<ui:define name="label">Experiment Name</ui:define>
<h:inputText id="experimentName" value="#{experimentTableIndexList.experimentTableIndex.experimentName}"/>
</s:decorate>
<s:decorate template="layout/display.xhtml">
<ui:define name="label">Experiment Table Name</ui:define>
<h:inputText id="experimentTableName" value="#{experimentTableIndexList.experimentTableIndex.experimentTableName}"/>
</s:decorate>
<s:decorate template="layout/display.xhtml">
<ui:define name="label">ProtXml</ui:define>
<h:inputText id="protXml" value="#{experimentTableIndexList.experimentTableIndex.protXml}"/>
</s:decorate>
</rich:simpleTogglePanel>
<div class="actionButtons">
<h:commandButton id="search" value="Search" action="/ExperimentTableIndexList.xhtml"/>
</div>
</h:form>
<rich:panel>
<f:facet name="header">Experiment Table List</f:facet>
<div class="results" id="experimentTableIndexList">
<h:outputText value="The Experiment Table Index search returned no results."
rendered="#{empty experimentTableIndexList.resultList}"/>
<rich:dataTable id="experimentTableIndexList"
var="experimentTableIndex"
value="#{experimentTableIndexList.resultList}"
rendered="#{not empty experimentTableIndexList.resultList}">
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Exp Table Id #{experimentTableIndexList.order=='expTableId asc' ? messages.down : ( experimentTableIndexList.order=='expTableId desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='expTableId asc' ? 'expTableId desc' : 'expTableId asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.expTableId}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Experiment Name #{experimentTableIndexList.order=='experimentName asc' ? messages.down : ( experimentTableIndexList.order=='experimentName desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='experimentName asc' ? 'experimentName desc' : 'experimentName asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.experimentName}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Experiment Table Name #{experimentTableIndexList.order=='experimentTableName asc' ? messages.down : ( experimentTableIndexList.order=='experimentTableName desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='experimentTableName asc' ? 'experimentTableName desc' : 'experimentTableName asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.experimentTableName}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="ProtXml #{experimentTableIndexList.order=='protXml asc' ? messages.down : ( experimentTableIndexList.order=='protXml desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='protXml asc' ? 'protXml desc' : 'protXml asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.protXml}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Date Created #{experimentTableIndexList.order=='dateCreated asc' ? messages.down : ( experimentTableIndexList.order=='dateCreated desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='dateCreated asc' ? 'dateCreated desc' : 'dateCreated asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.dateCreated}
</h:column>
<!--<h:column>
<f:facet name="header">action</f:facet>
<s:link view="/#{empty from ? 'ExperimentTableIndex' : from}.xhtml"
value="Select"
id="experimentTableIndex">
<f:param name="experimentTableIndexExpTableId"
value="#{experimentTableIndex.expTableId}"/>
</s:link>
</h:column>-->
</rich:dataTable>
</div>
</rich:panel>
<div class="tableControl">
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.previousExists}"
value="#{messages.left}#{messages.left} First Page"
id="firstPage">
<f:param name="firstResult" value="0"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.previousExists}"
value="#{messages.left} Previous Page"
id="previousPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.previousFirstResult}"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.nextExists}"
value="Next Page #{messages.right}"
id="nextPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.nextFirstResult}"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.nextExists}"
value="Last Page #{messages.right}#{messages.right}"
id="lastPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.lastFirstResult}"/>
</s:link>
</div>
</ui:define>
</ui:composition>
ver : jboss-4.2.3, jboss-seam-2.0.2.SP1
ExperimentTableIndexList.java returns experiment details.
Corresponding xhtml page (ExperimentTableIndexList.xhtml) works fine using default getEjbql without any order by clause
i.e. I can search or sort rich:dataTable without any error.
When I add order by clause in "getEjbql()" as below, and try to search or sort rich:dataTable on the basis of experiment name, it gives error as:
"javax.el.ELException: /ExperimentTableIndexList.xhtml @50,73 rendered="#{empty experimentTableIndexList.resultList}": Error reading 'resultList' on type com.novartis.bdm.proteomics.session.ExperimentTableIndexList_$$_javassist_3" which is
"<h:outputText value="The Experiment Table Index search returned no results."
rendered="#{empty experimentTableIndexList.resultList}"/>"
ExperimentTableIndexList.java
-----------------------------
@Name("experimentTableIndexList")
public class ExperimentTableIndexList extends EntityQuery {
private static final String[] RESTRICTIONS = {
"lower(experimentTableIndex.experimentName) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.experimentName}),'%')",
"lower(experimentTableIndex.experimentTableName) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.experimentTableName}),'%')",
"lower(experimentTableIndex.dateCreated) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.dateCreated}),'%')",
"lower(experimentTableIndex.protXml) like concat('%',lower(#{experimentTableIndexList.experimentTableIndex.protXml}),'%')",};
private ExperimentTableIndex experimentTableIndex = new ExperimentTableIndex();
@Override
public String getEjbql() {
//return "select experimentTableIndex from ExperimentTableIndex experimentTableIndex"; //THIS WORKS
return "select experimentTableIndex from ExperimentTableIndex experimentTableIndex ORDER BY experimentTableIndex.experimentName";
}
/**@Override
public Integer getMaxResults() {
return 25;
}**/
public ExperimentTableIndex getExperimentTableIndex() {
return experimentTableIndex;
}
@Override
public List<String> getRestrictions() {
return Arrays.asList(RESTRICTIONS);
}
}
ExperimentTableList.xhtml
-------------------------
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" id="globalMessages"/>
<h:form id="experimentTableIndexSearch" styleClass="edit">
<rich:simpleTogglePanel label="ExperimentTableIndex search parameters" switchType="ajax">
<s:decorate template="layout/display.xhtml">
<ui:define name="label">Experiment Name</ui:define>
<h:inputText id="experimentName" value="#{experimentTableIndexList.experimentTableIndex.experimentName}"/>
</s:decorate>
<s:decorate template="layout/display.xhtml">
<ui:define name="label">Experiment Table Name</ui:define>
<h:inputText id="experimentTableName" value="#{experimentTableIndexList.experimentTableIndex.experimentTableName}"/>
</s:decorate>
<s:decorate template="layout/display.xhtml">
<ui:define name="label">ProtXml</ui:define>
<h:inputText id="protXml" value="#{experimentTableIndexList.experimentTableIndex.protXml}"/>
</s:decorate>
</rich:simpleTogglePanel>
<div class="actionButtons">
<h:commandButton id="search" value="Search" action="/ExperimentTableIndexList.xhtml"/>
</div>
</h:form>
<rich:panel>
<f:facet name="header">Experiment Table List</f:facet>
<div class="results" id="experimentTableIndexList">
<h:outputText value="The Experiment Table Index search returned no results."
rendered="#{empty experimentTableIndexList.resultList}"/>
<rich:dataTable id="experimentTableIndexList"
var="experimentTableIndex"
value="#{experimentTableIndexList.resultList}"
rendered="#{not empty experimentTableIndexList.resultList}">
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Exp Table Id #{experimentTableIndexList.order=='expTableId asc' ? messages.down : ( experimentTableIndexList.order=='expTableId desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='expTableId asc' ? 'expTableId desc' : 'expTableId asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.expTableId}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Experiment Name #{experimentTableIndexList.order=='experimentName asc' ? messages.down : ( experimentTableIndexList.order=='experimentName desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='experimentName asc' ? 'experimentName desc' : 'experimentName asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.experimentName}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Experiment Table Name #{experimentTableIndexList.order=='experimentTableName asc' ? messages.down : ( experimentTableIndexList.order=='experimentTableName desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='experimentTableName asc' ? 'experimentTableName desc' : 'experimentTableName asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.experimentTableName}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="ProtXml #{experimentTableIndexList.order=='protXml asc' ? messages.down : ( experimentTableIndexList.order=='protXml desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='protXml asc' ? 'protXml desc' : 'protXml asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.protXml}
</h:column>
<h:column>
<f:facet name="header">
<s:link styleClass="columnHeader"
value="Date Created #{experimentTableIndexList.order=='dateCreated asc' ? messages.down : ( experimentTableIndexList.order=='dateCreated desc' ? messages.up : '' )}">
<f:param name="order" value="#{experimentTableIndexList.order=='dateCreated asc' ? 'dateCreated desc' : 'dateCreated asc'}"/>
</s:link>
</f:facet>
#{experimentTableIndex.dateCreated}
</h:column>
<!--<h:column>
<f:facet name="header">action</f:facet>
<s:link view="/#{empty from ? 'ExperimentTableIndex' : from}.xhtml"
value="Select"
id="experimentTableIndex">
<f:param name="experimentTableIndexExpTableId"
value="#{experimentTableIndex.expTableId}"/>
</s:link>
</h:column>-->
</rich:dataTable>
</div>
</rich:panel>
<div class="tableControl">
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.previousExists}"
value="#{messages.left}#{messages.left} First Page"
id="firstPage">
<f:param name="firstResult" value="0"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.previousExists}"
value="#{messages.left} Previous Page"
id="previousPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.previousFirstResult}"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.nextExists}"
value="Next Page #{messages.right}"
id="nextPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.nextFirstResult}"/>
</s:link>
<s:link view="/ExperimentTableIndexList.xhtml"
rendered="#{experimentTableIndexList.nextExists}"
value="Last Page #{messages.right}#{messages.right}"
id="lastPage">
<f:param name="firstResult"
value="#{experimentTableIndexList.lastFirstResult}"/>
</s:link>
</div>
</ui:define>
</ui:composition>