2012-10-27 2 views
0

내 사용자 테이블은 다음과 같다 결과 :최대 절전 모드 기준은

ORM은 다음과 같습니다
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), 
) 

:

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

매우 간단합니다. 주문 매개 변수가 메서드에 전달되지 않았을 때 사용자 별 기본 정렬 인 Lastname을 사용하고 있습니다. PageSize가 25이고 pageNr이 httpRequest param (DisplayTag)에서 가져온 경우 0부터 시작하여 위로 이동합니다.

스프링 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

성이 동일한 사용자가 여러 명인 경우 성으로 정렬하면 성으로 정렬 된 사용자가 표시되지만 동일한 성을 공유하는 사용자의 순서는 아무런 보장이 없습니다. 따라서 결정 성 순서를 보장하기 위해 추가 정렬 기준을 추가해야합니다. 예를 들면 다음과 같습니다.

이 경우 동일한 성을 공유하는 사용자는 항상 ID로 정렬되며 순서는 결정적입니다.

+0

Yupp, 그게 다예요 :) – kamil