2015-12-03 94 views
-1

我必須把我的dataTable變成lazy dataTable。我該怎麼做?下面是我的示例代碼:如何使用Spring和Hibernate在Primefaces中執行lazy dataTable?

IndexBean.java

@Name("indexBean") 
public class IndexBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    UserService userService; 
    private List<User> userList; 

    @Inject 
    MessageService messageService; 
    private List<Message> messageList; 

    private Integer dataTableRendered; 

    public void getAllUser() { 
     setDataTableRendered(1); 
     userList = new ArrayList<User>(); 
     userList = userService.getAllUser(); 
     if (userList.size() > 0) { 
      addMessageSuccess("Success", "Success"); 
     } else { 
      addMessageError("Failure", "Failure!"); 
     } 
    } 

    public void getAllMessages() { 
     setDataTableRendered(2); 
     messageList = new ArrayList<Message>(); 
     messageList = messageService.getAllMessages(); 
     if (messageList.size() > 0) { 
      addMessageSuccess("Success", "Success"); 
     } else { 
      addMessageError("Failure", "Failure!"); 
     } 
    } 

    public void addMessageSuccess(String summary, String detail) { 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
    } 

    public void addMessageError(String summary, String detail) { 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
    } 

    public List<User> getUserList() { 
     return userList; 
    } 
    public void setUserList(List<User> userList) { 
     this.userList = userList; 
    } 
    public List<Message> getMessageList() { 
     return messageList; 
    } 
    public void setMessageList(List<Message> messageList) { 
     this.messageList = messageList; 
    } 
    public Integer getDataTableRendered() { 
     return dataTableRendered; 
    } 
    public void setDataTableRendered(Integer dataTableRendered) { 
     this.dataTableRendered = dataTableRendered; 
    } 
} 

的index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:h="http://java.sun.com/jsf/html"> 

    <h:head></h:head> 
<p:layout fullPage="true"> 

    <!-- Status Waiting Dialog --> 
    <p:ajaxStatus onstart="PF('statusDialog').show()" 
     onsuccess="PF('statusDialog').hide()" /> 

    <p:dialog widgetVar="statusDialog" modal="true" draggable="false" 
     closable="false" resizable="false" showHeader="true" 
     header="Please wait..."> 
     <p:graphicImage value="/images/loader.gif" 
      style=" float: left;position: relative;left: 30%;" /> 
    </p:dialog> 

    <!-- Left Layout --> 
    <p:layoutUnit position="west" id="west"> 

     <p:growl autoUpdate="true" id="infoMessage" showDetail="true" 
      showSummary="true" sticky="false" /> 

     <p:commandButton value="Get Users" 
      actionListener="#{indexBean.getAllUser}" 
      update="infoMessage,centerForm,centerForm:userTable" /> 

     <p:commandButton value="Get Messages" 
      actionListener="#{indexBean.getAllMessages}" 
      update="infoMessage,centerForm,centerForm:messageRaporTable" /> 

    </p:layoutUnit> 

    <!-- Center Layout --> 
    <p:layoutUnit position="center" id="center"> 

     <h:form id="centerForm"> 

      <!-- User dataTable --> 
      <p:dataTable id="userTable" var="user" 
       value="#{indexBean.userList }" paginator="true" rows="10" 
       lazy="true" rendered="#{indexBean.dataTableRendered ==1}" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="5,10,15,20,25,50,100"> 

       <p:column headerText="userid" sortBy="#{user.userId}" 
        filterBy="#{user.userId}"> 
        <h:outputText value="#{user.userId}"></h:outputText> 
       </p:column> 
       <p:column headerText="username" sortBy="#{user.userName}" 
        filterBy="#{user.userName}"> 
        <h:outputText value="#{user.userName}"></h:outputText> 
       </p:column> 
       <p:column headerText="firstname" sortBy="#{user.userFirstName}" 
        filterBy="#{user.userFirstName}"> 
        <h:outputText value="#{user.userFirstName}"></h:outputText> 
       </p:column> 
      </p:dataTable> 

      <p:column headerText="Message Id" 
        filterBy="#{message.messageId}" 
        sortBy="#{message.messageId}"> 
        <h:outputText value="#{message.messageId}" /> 
       </p:column> 
       <p:column headerText="Sender" 
        sortBy="#{message.messageSender}" filterBy="#{message.messageSender}"> 
        <h:outputText value="#{message.messageSender}" /> 
       </p:column> 
       <p:column headerText="Receiver" 
        sortBy="#{message.messageReceiver}" 
        filterBy="#{message.messageReceiver}"> 
        <h:outputText value="#{message.messageReceiver}" /> 
       </p:column> 
       <p:column headerText="Subject" 
        sortBy="#{message.messageSubject}" 
        filterBy="#{message.messageSubject}"> 
        <h:outputText value="#{message.messageSubject}" /> 
       </p:column> 
       <p:column headerText="Message" 
        sortBy="#{message.messageText}" 
        filterBy="#{message.messageText}"> 
        <h:outputText value="#{message.messageText}" /> 
       </p:column> 

      </p:dataTable> 

     </h:form> 

    </p:layoutUnit> 

</p:layout> 

UserService.java

public interface UserService { 

    public List<User> getAllUser(); 
} 

UserServiceImpl.java

@Service("userService") 
@Component 
@Transactional 
public class UserServiceImpl implements UserService { 


    @Autowired 
    private UserDAO userDAO; 

    @Override 
    public List<User> getAllUser() { 
     return userDAO.getAllUser(); 
    } 

} 

UserDAO.java

public interface UserDAO { 

    public List<User> getAllUser(); 

} 

UserDAOImpl.java - 其實這SQL更加複雜。

@Component 
@Repository("userDAO") 
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO { 


    @SuppressWarnings("unchecked") 
    @Override 
    public List<User> getAllUser() { 
     List<User> userList = new ArrayList<User>(); 
     String sql = "select * from SECRETDB.USER"; 


     try { 
      Query query = getSession().createSQLQuery(sql).addScalar("userOID", StringType.INSTANCE) 
        .addScalar("userName", StringType.INSTANCE).addScalar("firstName", StringType.INSTANCE) 
        .setResultTransformer(Transformers.aliasToBean(User.class)).setCacheable(false) 
        .setCacheMode(CacheMode.IGNORE); 

      userList = query.list(); 
      getSession().clear(); 
     } catch (HibernateException e) { 
      getSession().clear(); 
      e.printStackTrace(); 
     } 

     return userList; 
    } 

User.java

public class User { 

    private String userOID; 
    private String userName; 
    private String firstName; 

    public String getUserOID() { 
     return userOID; 
    } 

    public void setUserOID(String userOID) { 
     this.userOID = userOID; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

} 

HibernateDaoSupport.java

public abstract class HibernateDaoSupport { 

    @Autowired 
    private SessionFactory sessionFactory; 

    protected Session getSession() { 
     return sessionFactory.getCurrentSession(); 
    } 
} 
+1

什麼是您的實際編碼問題?我看到所有非惰性Java代碼,並且只能在數據表上使用懶惰屬性。如下所示,首先使用展示臺,搜索互聯網,敲打你的頭,再次敲你的頭,然後回到真正的編碼問題。 – Kukeltje

回答

0

這就是我如何做到這一點。

public class ImagePaginator extends LazyDataModel<PhotoObject> { 

private ISession session; 
private int startId; 
private int endId; 
private User user; 
private static final long serialVersionUID = 1L; 
private SearchController searchController; 

public ImagePaginator(User user, SearchController searchController) { 
    this.session = user.getSession(); 
    this.user = user; 
    this.searchController = searchController; 
} 

@Override 
public List<PhotoObject> load(int first, int pageSize, String sortField, SortOrder sortOrder, 
     Map<String, Object> filters) { 

    // collect paginated data from server 
    Collection<IObject> photos = searchController.getResultAccount().getPaginatedObjects(first, first + 3, 
      SystemConstants.PHOTO); 
    List<PhotoObject> data = new ArrayList<PhotoObject>(); 

    for (IObject resultPhoto : photos) { 
     IPhoto photo = (IPhoto) resultPhoto; 
     data.add(new PhotoObject(photo)); 
    } 

    this.setRowCount(data.size() + 1); 

    return data; 
} 

@Override 
public Object getRowKey(PhotoObject photoObject) { 
    return photoObject.getId(); 
} 

public ISession getSession() { 
    return session; 
} 

public void setSession(ISession session) { 
    this.session = session; 
} 

public int getStartId() { 
    return startId; 
} 

public void setStartId(int startId) { 
    this.startId = startId; 
} 

public User getUser() { 
    return user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

public SearchController getSearchController() { 
    return searchController; 
} 

public void setSearchController(SearchController searchController) { 
    this.searchController = searchController; 
} 

public int getEndId() { 
    return endId; 
} 

public void setEndId(int endId) { 
    this.endId = endId; 
} 

就像你我使用服務來檢索結果。我發送的SQL(根據情況)是:

public List<IEntity> retrievePaginatedById(String classType, String targetId, String status, int id, int offset, 
     int limit, boolean forContactRequestNotification) { 
    SessionFactory sessionFactory = createSessionFactory(); 
    Session session = sessionFactory.openSession(); 
    String hql = null; 
    if (forContactRequestNotification) { 
     hql = "FROM " + classType + " D WHERE " + targetId + "=" + "'" + id + "' AND D.status = '" + status 
       + "' ORDER BY D.id DESC"; 
    } else { 
     hql = "FROM " + classType + " D WHERE " + targetId + "=" + "'" + id + "'" + " ORDER BY D.id DESC"; 
    } 
    Query query = session.createQuery(hql).setFirstResult(offset).setMaxResults(limit); 
    @SuppressWarnings("unchecked") 
    List<IEntity> results = query.list(); 
    session.close(); 
    sessionFactory.close(); 
    return results; 
} 
4

在您的index.xhtml數據表,我看到

value="#{indexBean.userList }" paginator="true" rows="10" 
      lazy="true" 

其中USERLIST指向

private List<User> userList; 

這是不對的。它應該是

private LazyUserDataModel<User> userList 

請仔細閱讀167-168 showcaseuserguide頁面來實現LazyDataModel。這裏沒有人會去你來實現它。下面是一個使用hibernate和JPA的通用lazydatamodel的例子。

public class GenericLazyDataModel<T> extends LazyDataModel<T> { 

@Transient 
protected static Logger debugLogger = Logger.getLogger("DebugLogger"); 

protected EntityManager entityManager; 
protected String hqlQuery; 
private String countQuery; 
protected List<SortFieldInfoDTO> defaultSortFields; 
protected List<T> currentObjectList; 
protected List<Object> parameterValues; 
protected List<String> parameterName; 

protected List<Object> filterFieldValues; 
protected List<String> filterFieldName; 


public GenericLazyDataModel(EntityManager entityManager, String hqlQuery, 
     String countQuery, List<SortFieldInfoDTO> sortFieldInfos, 
     List<Object> parameterValues, List<String> parameterName) { 
    super(); 
    this.entityManager = entityManager; 
    this.hqlQuery = hqlQuery; 
    this.countQuery = countQuery; 
    this.defaultSortFields = sortFieldInfos; 
    this.parameterValues = parameterValues; 
    this.parameterName = parameterName; 
    this.setRowCount(calculateRecordCount()); 

} 

@Override 
public List<T> load(int first, int pageSize, String sortField, 
     SortOrder sortOrder, Map<String, Object> filters) { 

    String sqlQuery = hqlQuery; 
    int filterCount = 0; 
    if(sortOrder==null){ 
     sortOrder=SortOrder.ASCENDING; 
    } 

    if (filterFieldValues != null && filterFieldName != null) { 
     filterFieldValues.clear(); 
     filterFieldName.clear(); 
    } 
    for (Iterator<String> iterator = filters.keySet().iterator(); iterator 
      .hasNext();) { 
     String filterField = iterator.next(); 
     if (debugLogger.isInfoEnabled()) { 
      debugLogger.info("Filter Field Name " + filterField); 
     } 

     // Check if the HQL Query already has a where clause 
     if (sqlQuery.toLowerCase().indexOf("where") != -1) { 
      sqlQuery = sqlQuery + " and " + filterField 
        + " like :filterFieldValue" + filterCount; 
     } else { 
      sqlQuery = sqlQuery + " where " + filterField 
        + " like :filterFieldValue" + filterCount; 
     } 

     if (filterFieldValues == null) { 
      filterFieldValues = new ArrayList<Object>(); 
     } 

     if (filterFieldName == null) { 
      filterFieldName = new ArrayList<String>(); 
     } 

     filterFieldValues.add(((String)filters.get(filterField)).toUpperCase() + "%"); 
     filterFieldName.add("filterFieldValue" + filterCount); 
     filterCount++; 

    } 


    //************************ 
    boolean isOrderFieldFound=Boolean.FALSE; 
    if(sortField !=null && !sortField.isEmpty()){ 
     isOrderFieldFound=Boolean.TRUE; 
     sqlQuery = sqlQuery + " order by " + sortField+(sortOrder==SortOrder.ASCENDING?" ASC ":" DESC "); 
    } 
    if(isOrderFieldFound){ 

     if(defaultSortFields !=null && !defaultSortFields.isEmpty()){ 
      for(SortFieldInfoDTO fld:defaultSortFields){ 
       if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery=sqlQuery+" , "+fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC "); 
      } 
     } 

    }else{ 
     if(defaultSortFields !=null && !defaultSortFields.isEmpty()){ 
      int index=0; 
      for(SortFieldInfoDTO fld:defaultSortFields){ 
       if(index==0){ 
        if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery = sqlQuery + " order by " + fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC "); 
        index++; 
       }else{ 
        if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery=sqlQuery+" , "+fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC "); 
       } 
      } 
     } 
    } 

    //********************************* 
    if (debugLogger.isInfoEnabled())debugLogger.info("sqlQuery:"+sqlQuery); 
    Query query = entityManager.createQuery(sqlQuery); 
    int parameterCount = 0; 
    if (parameterValues != null) { 
     for (Iterator<Object> iterator = parameterValues.iterator(); iterator 
       .hasNext();) { 
      Object type = iterator.next(); 
      query.setParameter(parameterName.get(parameterCount), type); 
      parameterCount++; 
     } 
    } 

    int parameterCount1 = 0; 
    if (filterFieldValues != null && !filterFieldValues.equals("")) { 
     for (Iterator<Object> iterator = filterFieldValues.iterator(); iterator 
       .hasNext();) { 
      Object type = iterator.next(); 
      query.setParameter(filterFieldName.get(parameterCount1), type); 
      parameterCount1++; 
     } 
    } 

    if (debugLogger.isInfoEnabled())debugLogger.info("first page value " + first); 
    if (debugLogger.isInfoEnabled())debugLogger.info("pageSize page value " + pageSize); 

    query.setFirstResult(first); 
    query.setMaxResults(pageSize); 
    currentObjectList = query.getResultList(); 
    return currentObjectList; 
} 

private int calculateRecordCount() { 
    Query query = entityManager.createQuery(countQuery); 
    int parameterCount = 0;  
    if (parameterValues != null) { 
     for (Iterator<Object> iterator = parameterValues.iterator(); iterator 
       .hasNext();) { 
      Object type = iterator.next(); 
      query.setParameter(parameterName.get(parameterCount), type); 
      parameterCount++; 
     } 
    } 

    if (filterFieldValues != null) { 
     for (Iterator<Object> iterator = filterFieldValues.iterator(); iterator 
       .hasNext();) { 
      Object type = iterator.next(); 
      query.setParameter(filterFieldName.get(parameterCount), type); 
      parameterCount++; 
     } 
    } 

    Long rowCount = (Long) query.getSingleResult(); 
    if (debugLogger.isInfoEnabled()) { 
     debugLogger.info("rowCount Application Data Model" + rowCount); 
    } 
    return rowCount.intValue(); 

} 

public List<T> getCurrentObjectList() { 
    return currentObjectList; 
} 

}

使用這種學習對自己的身材了這一點,和好運氣。

+0

廣泛的答案...您可以創建一個關於在stackoverflow中使用泛型LazyDataModel的具體問題,並將其作爲答案發布。上面的問題不是這個答案的正確位置 – Kukeltje

+0

JPA'CriteriaBuilder' API用於創建動態查詢。 – Tiny

相關問題