很多時候我們會根據動態條件去查找數據,這個時候如果自己去動態構建HQL語句,語句就會比較複雜,這個時候Criteria Query可以幫助我們從面向對象的角度來構建SQL,下面舉例說明一下,按照動態條件的分頁查詢如何實現,對用戶進行動態條件查詢,查詢條件包含角色信息
UserQuery:
public class Query {
private Integer startRow;
private String sortBy;
private String sortType;
private Integer querySize;
public Query(){
}
public Query(Query query){
this.startRow = query.startRow;
this.sortBy = query.sortBy;
this.sortType = query.sortType;
this.querySize= query.querySize;
}
public Integer getStartRow() {
return startRow;
}
public void setStartRow(Integer startRow) {
this.startRow = startRow;
}
public String getSortBy() {
return sortBy;
}
public void setSortBy(String sortBy) {
this.sortBy = sortBy;
}
public String getSortType() {
return sortType;
}
public void setSortType(String sortType) {
this.sortType = sortType;
}
/**
* @return the querySize
*/
public Integer getQuerySize() {
return querySize;
}
/**
* @param querySize
* the querySize to set
*/
public void setQuerySize(Integer querySize) {
this.querySize = querySize;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass())
.add("startRow", startRow).add("querySize", querySize)
.add("sortBy", sortBy).add("sortType", sortType)
.toString();
}
public class UserQuery extends Query {
private String username;
private String rolename;
public UserQuery(){
}
public UserQuery(UserQuery query){
super(query);
this.username = query.username;
this.rolename = query.rolename;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* @return the rolename
*/
public String getRolename() {
return rolename;
}
/**
* @param rolename the rolename to set
*/
public void setRolename(String rolename) {
this.rolename = rolename;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass())
.add("startRow", getStartRow()).add("querySize", getQuerySize())
.add("sortBy", getSortBy()).add("sortType", getSortType())
.add("username", username).add("rolename", rolename)
.toString();
}
}
按照條件查詢用戶總數和按照條件查詢分頁用戶實現
public int getTotalCount(UserQuery query) {
if(null == query){
throw new IllegalArgumentException("query should not be null");
}
if(LOG.isDebugEnabled()){
LOG.debug("create criteria with query: " + query);
}
Criteria c = createCriteria(query);
return ((Long)c.setProjection(Projections.rowCount()).uniqueResult()).intValue();
}
private Criteria createCriteria(UserQuery query) {
if(LOG.isDebugEnabled()){
LOG.debug("create criteria with query: " + query);
}
Criteria c = getSession().createCriteria(User.class);
if(EnumUtils.isValidEnum(RoleNameEnum.class, query.getRolename())){
c.createAlias("roles", "role");
c.add(Restrictions.eq("role.name", query.getRolename()));
}
return c;
}
/**
* @param Query should not be null
* @return Result list (UserInfo), list is empty if no result found
*/
@SuppressWarnings("unchecked")
public List<User> findUserByQuery(UserQuery query) {
if(null == query){
throw new IllegalArgumentException("query should not be null");
}
Criteria c = createCriteria(query);
if (query.getStartRow() != null){
c.setFirstResult(query.getStartRow());
}
if (query.getQuerySize() != null){
c.setMaxResults(query.getQuerySize());
}
return c.list();
}