framework:entity-query : Query is invoked multiple times
kipod Oct 7, 2009 12:21 PMHi all,
I'm trying to avoid multiple queries into the DB, my design is obviously wrong somehow, though I don't know how should this be elegantly acompilshed.
I have a Client entity and a Sale entity, where each Sale has a Client.
from Sale.java :
private Client client;
   
@NotNull
@ManyToOne
@JoinColumn(name="client_id")
public Client getClient() {
        return client;
}
public void setClient(Client client) {
        this.client = client;
}
The Client entity has no awareness of any Sales (it's a one-way relation thing).
I have this in my components.xml :
<framework:entity-query name="allClientsQuery"
                        ejbql="select c from Client c"
                        order="c.name asc" />
<factory name="allClients" value="#{allClientsQuery.resultList}" scope="conversation"/>And in the Sales.xhtml page I have a search box where you can select a Client as a search criteria:
<h:selectOneMenu value="#{saleList.clientId}">
   <s:selectItems value="#{allClients}" var="c" itemValue="#{c.id}" label="#{c.name}" />
</h:selectOneMenu>As well as a table that shows the current search results, one column on which is the Client of the Sale's name:
<rich:dataTable
        id="saleTable"
        onRowMouseOver="this.style.backgroundColor='#F8F8F8'"
        onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
        value="#{saleList.resultList}"
        var="_sale"
        sortMode="single"
        rows="10"
        rendered="#{not empty saleList.resultList}">
        ...
        <rich:column sortBy="#{_sale.client.name}"
                        width="150px" >
                <f:facet name="header">
                        <h:outputText value="#{messages['client.client']}" />
                </f:facet>
                <h:outputText id="saleClient" value="#{_sale.client.name}" />
        </rich:column>
        ...
</rich:dataTable>The saleList
 component is a simple EntityQuery<Sale> (the MyList class is a common base class for lists, doesn't add much) :
@Name("saleList")
@Scope(ScopeType.CONVERSATION)
public class SaleList extends MyList<Sale>
{
                
        private static final String EJBQL = "select s from Sale s";
        ... RESTRICTIONS and search criteria stuff ...
}AND - When the page is displayed the allClientsQuery
 (select c from Client c asc ...
)
is ran as well as a
"select client0_.id as id0_0_, ... client0_.name as name0_0_, ... from Client client0_ where client0_.id=?"
For each one of the Sales.
How can I make it so that a single query into the Clients table answers all the page's needs ??
Thanks!
 
     
    