2012-10-27 130 views
0

我的用戶表看起來像這樣:休眠條件的結果

USER (
    "USER_ID" NUMBER(15,0) NOT NULL, 
    "TYPE" NUMBER(2,0), 
    "DOMAIN_ID" NUMBER(15,0), 
    "FIRST_NAME" VARCHAR2(64), 
    "LAST_NAME" VARCHAR2(64) NOT NULL, 
    "EMAIL" VARCHAR2(256), 
    "PHONE_NUMBER" VARCHAR2(11), 
    "IS_ENABLED" NUMBER(1,0), 
) 

ORM看起來是這樣的:

@Entity 
@Table(name = "\"USER\"") 
public class User implements Serializable 
{ 
    @Id 
    @GeneratedValue(generator = "USER_SEQ") 
    @GenericGenerator(name = "USER_SEQ", strategy = "sequence", parameters = @Parameter(name = "sequence", value = "SEQ_USER_ID")) 
    @Column(name = "USER_ID", nullable = false) 
    private Long userId; 

    @Column(name = "FIRST_NAME") 
    private String firstName; 

    @Column(name = "LAST_NAME") 
    private String lastName; 

    @Column(name = "EMAIL") 
    private String email; 

    @Column(name = "PHONE_NUMBER") 
    private String phoneNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @Cascade(CascadeType.ALL) 
    @JoinColumn(name = "DOMAIN_ID") 
    @ForeignKey(name = "DOMAIN_ID") 
    private Domain domain; 

    @Column(name = "IS_ENABLED") 
    private Boolean isEnabled; 

    @Column(name = "TYPE") 
    private Integer type; 
} 

而且我在做標準的用戶列表:

@SuppressWarnings("unchecked") 
public List<User> getUsersList(String firstName, String lastName, Integer domainId, Boolean activeFlag, String email, 
           String phoneNr, int pageNr, int pageSize, String sortColumn, Boolean sortAscending) 
{ 
    Session session = sessionFactory.getCurrentSession(); 
    Criteria criteria = createUserCriteria(firstName, lastName, domainId, activeFlag, email, phoneNr, session); 

    criteria.createAlias("domain", "domain"); 
    criteria.setFirstResult(pageSize * pageNr); 
    criteria.setMaxResults(pageSize); 
    criteria.setFetchSize(pageSize); 

    Order order; 
    if (sortColumn != null && sortAscending != null) 
    { 
     order = (sortAscending) ? Order.asc(sortColumn) : Order.desc(sortColumn); 
    } else 
    { 
     order = Order.asc("lastName"); 
    } 

    criteria.addOrder(order); 

    return criteria.list(); 
} 

private Criteria createBusinessUserCriteria(String firstName, String lastName, Integer domainId, Boolean activeFlag, String email, String phoneNr, Session session) 
{ 
    Criteria criteria = session.createCriteria(User.class); 
    // only businness users 
    criteria.add(Restrictions.eq("type", UserTypeEnum.BUSINESS_USER.getUserTypeId())); 

    if (firstName != null) 
    { 
     criteria.add(Restrictions.like("firstName", firstName + "%").ignoreCase()); 
    } 
    if (lastName != null) 
    { 
     criteria.add(Restrictions.like("lastName", lastName + "%").ignoreCase()); 
    } 
    if (domainId != null) 
    { 
     criteria.add(Restrictions.eq("domain.domainId", domainId)); 
    } 
    if (activeFlag != null) 
    { 
     criteria.add(Restrictions.eq("isEnabled", activeFlag)); 
    } else 
    { 
     criteria.add(Restrictions.eq("isEnabled", true)); 
    } 
    if (email != null) 
    { 
     criteria.add(Restrictions.like("email", email + "%").ignoreCase()); 
    } 
    if (phoneNr != null) 
    { 
     criteria.add(Restrictions.like("phoneNumber", phoneNr + "%").ignoreCase()); 
    } 
    return criteria; 
} 

很簡單,當沒有Order參數傳遞給方法時,我使用用戶Lastname的默認排序。 PageSize是25,pageNr取自httpRequest參數(DisplayTag),它從0開始並上升。

Spring MVC的控制器這樣的:

@RequestMapping(value = "/GetNotificationUsers/", method = RequestMethod.GET) 
public String getNotificationUsers(@ModelAttribute("eventNotifUserSearchForm") UsersSearchForm searchForm, Model model, 
            HttpServletRequest request) throws IOException 
{ 
    searchForm.setDefaultsToNull(); 

    Integer pageNr = 0; 
    String pageNoParamAsString = request.getParameter(new ParamEncoder("eventNotifUsers").encodeParameterName(
      TableTagParameters.PARAMETER_PAGE)); 
    if (pageNoParamAsString != null && !pageNoParamAsString.isEmpty()) 
    { 
     pageNr = Integer.parseInt(pageNoParamAsString) - 1; 
    } 

    List<User> resultUsersList = administrativeManager.getUsersList(searchForm.getFirstName(), 
      searchForm.getLastName(), userManager.getLoggedInUser().getDomain().getDomainId(), searchForm.getEnabledFlag(), 
      searchForm.getEmail(), searchForm.getPhoneNumber(), pageNr, PAGE_SIZE, null, null); 

    Long size = administrativeManager.getUsersListCount(searchForm.getFirstName(), searchForm.getLastName(), 
      searchForm.getDomainId(), searchForm.getEnabledFlag(), searchForm.getEmail(), searchForm.getPhoneNumber()); 
    //for (User user : resultUsersList) 
    //{ 
    // System.out.println(user); 
    //} 
    model.addAttribute("eventUserListSize", size.intValue()); 
    model.addAttribute("eventNotifUsers", resultUsersList); 
    model.addAttribute("pageSize", PAGE_SIZE); 

    return "notifications/EventNotificationUserList"; 
} 

DisplayTag JSP:

<display:table name="${eventNotifUsers}" id="eventNotifUsers" pagesize="${pageSize}" 
       cellspacing="0" cellpadding="10" requestURI="" partialList="true" size="eventUserListSize" sort="external" defaultsort="2"> 
    <display:column title="FirstName" property="firstName"/> 
    <display:column property="lastName" title="LastName"/> 
    <display:column property="email" title="Email"/> 
    <display:column property="phoneNumber" title="Phone"/> 
</display:table> 

但是,當我顯示實際工作列表中,第一頁看起來不錯,但隨後直到最後的第一個重複。當我刪除Order它工作正常。我不知道爲什麼...什麼可能是錯的?

編輯

經過一番研究,我發現,這個問題只有通過lastName的排序時。是否有可能,因爲我的測試具有相同的lastName?當按其他列排序時,它工作正常。

回答

1

如果您有多個用戶姓氏相同,按姓氏排序將返回按姓氏排序的用戶,但您對共享相同姓氏的用戶的順序沒有任何保證。所以你應該添加一個額外的排序標準來保證確定性的順序。例如:

order by lastName asc, userId asc 

在這種情況下,用戶共享相同的姓氏會一直按ID排序,該訂單將是確定性的。

+0

Yupp,就是這樣:) – kamil