如何使用Spring和Hibernate在Primefaces中执行懒惰的dataTable?

sss*_*sss -1 jsf spring hibernate primefaces

我必须将我的dataTable转换为惰性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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

UserService.java

public interface UserService {

    public List<User> getAllUser();
}
Run Code Online (Sandbox Code Playgroud)

UserServiceImpl.java

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


    @Autowired
    private UserDAO userDAO;

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

}
Run Code Online (Sandbox Code Playgroud)

UserDAO.java

public interface UserDAO {

    public List<User> getAllUser();

}
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

HibernateDaoSupport.java

public abstract class HibernateDaoSupport {

    @Autowired
    private SessionFactory sessionFactory;

    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*iar 5

在index.xhtml中的数据表中,我看到了

  value="#{indexBean.userList }" paginator="true" rows="10"
            lazy="true" 
Run Code Online (Sandbox Code Playgroud)

userList指向的位置

  private List<User> userList; 
Run Code Online (Sandbox Code Playgroud)

错了 它应该是

  private LazyUserDataModel<User> userList
Run Code Online (Sandbox Code Playgroud)

请阅读展示userguide页167-168实施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;
}
Run Code Online (Sandbox Code Playgroud)

}

使用这个并自己学习,祝您好运。