Showing posts with label Criteria Query. Show all posts
Showing posts with label Criteria Query. Show all posts

Syntax to use OrderBy in Hibernate Criteria Query

The order can be specified using addOrder on a Criteria Object
criteria.addOrder(Order.asc("propertyName"))
criteria.addOrder(Order.desc("propertyName"))

Order results according to an order in Hibernate 

Suppose we have a class
Category.java
package com.ekiras.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="category")
public class Category {

public Category(){}
public Category(Long id){
this.id = id;
}
public Category(Long id, String name){
this.id = id;
this.name = name;
}

@Id
@Column(nullable=false, name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(nullable=false, name="name")
private String name;

// Getters and Setters

}
So if we need to order the results of this class according to a given order we can do it like following

  • Order by propertyName id in ascending order
    sessionFactory.getCurrentSession()
    .createCriteria(Catgeory.class)
    .addOrder(Order.asc("id"))
    .list();
  • Order by propertyName name in descending order
    sessionFactory.getCurrentSession()
    .createCriteria(Catgeory.class)
    .addOrder(Order.desc("name"))
    .list();
  • Order by propertyName name in random order
    sessionFactory.getCurrentSession()
    .createCriteria(Catgeory.class)
    criteria.add(Restrictions.sqlRestriction("1=1 order by rand()"));
    .list();
    The above code will return the list of Category domain objects in a random order.


Syntax to get List of domain Object

list can be used on the Criteria object as shown below.
criteria.list()

How to get a List of a Domain class using Hibernate's Criteria Query.

If we have a domain class Category as shown below.

Catgeory.class
package com.ekiras.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="category")
public class Category {

public Category(){}
public Category(Long id){
this.id = id;
}
public Category(Long id, String name){
this.id = id;
this.name = name;
}

@Id
@Column(nullable=false, name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column(nullable=false, name="name")
private String name;

// Getters and Setters

}

We can get the list of all the categories using Criteria Query in the following ways

  • Simplest way to get a list of a Domain class (Category) in our example is
    sessionFactory.getCurrentSession().createCriteria(Category.class).list();
  • You can use pagination in the following way with list()
    @SuppressWarnings("unchecked")
    public List<Category>; list(Integer offset){
    return sessionFactory.getCurrentSession()
    .createCriteria(Category.class)
    .setFirstResult(offset!=null?offset:0)
    .setMaxResults(10)
    .list();
    }
  • Use this method as a generic method to get a list of all the records of a domain in the database.
    @SuppressWarnings("rawtypes")
    public List list(Class clazz){
    return (List)getSession().createCriteria(clazz).list();
    }
  • You can Order your list according to any property like
    public List<Category> list(Integer offset){
    return getSession()
    .createCriteria(Category.class)
    .addOrder(Order.desc("id"))
    .list();
    }

Points To Remember



Pagination in Spring Hibernate Application using Bootstrap


  • Create a Domain Person.
  • Create a Service PersonService
  • Create a Dao PersonDao.
  • Create a Controller PersonController.
  • Create a Taglib PaginationTaglib.

Person.java
package com.ekiras.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="person")
public class Person {

public Person(){};
public Person(String name,Integer age){
this.name = name;
this.age = age;
}


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;

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

@Column(name="age")
private Integer age;

// GETTERS and SETTERS

PersonService.java
package com.ekiras.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ekiras.dao.PersonDAO;
import com.ekiras.domain.Person;

@Service
public class PersonService {

@Autowired
private PersonDAO personDAO;


public List<Person> list(Integer offset, Integer maxResults){
return personDAO.list(offset, maxResults);
}

public Long count(){
return personDAO.count();
}

public void save(){
personDAO.save();
}

}

PersonDAO.java
package com.ekiras.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ekiras.domain.Person;

@Repository
@Transactional
public class PersonDAO {

@Autowired
private SessionFactory sessionFactory;

@SuppressWarnings("unchecked")
@Transactional
public List<Person> list(Integer offset, Integer maxResults){
return sessionFactory.openSession()
.createCriteria(Person.class)
.setFirstResult(offset!=null?offset:0)
.setMaxResults(maxResults!=null?maxResults:10)
.list();
}


public Long count(){
return (Long)sessionFactory.openSession()
.createCriteria(Person.class)
.setProjection(Projections.rowCount())
.uniqueResult();
}


public void save(){
for(int itr=1;itr <= 100 ; itr++){
Person person = new Person("Person_"+itr,Math.max(25, (itr%2)*35));
sessionFactory.openSession()
.save(person);
}



}

}

PersonController.java
package com.ekiras.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.ekiras.service.PersonService;

@Controller
@RequestMapping(value="/person")
public class PersonController {

@Autowired
private PersonService personService;

@RequestMapping(value="/list")
public String list(Model model, Integer offset, Integer maxResults){
model.addAttribute("persons", personService.list(offset, maxResults));
model.addAttribute("count", personService.count());
model.addAttribute("offset", offset);
return "/person/list";
}

@RequestMapping(value="/save")
public String save(){
personService.save();
return "/person/list";
}

}

PaginationTaglib.java
package com.ekiras.taglib;

import java.io.Writer;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class PaginationTaglib extends SimpleTagSupport {
private String uri;
private int offset;
private int count;
private int max = 10;
private int steps = 10;
private String previous = "Previous";
private String next = "Next";

private Writer getWriter() {
JspWriter out = getJspContext().getOut();
return out;
}

@Override
public void doTag() throws JspException {
Writer out = getWriter();

try {
out.write("<nav>");
out.write("<ul class=\"pagination\">");

if(offset<steps)
out.write(constructLink(1, previous, "disabled", true));
else
out.write(constructLink(offset-steps, previous, null, false));

for(int itr=0;itr<count;itr+=steps) {
if(offset==itr)
out.write(constructLink((itr/10+1)-1 *steps, String.valueOf(itr/10+1), "active", true));
else
out.write(constructLink(itr/10*steps, String.valueOf(itr/10+1), null , false));
}

if(offset+steps>=count)
out.write(constructLink(offset+steps, next, "disabled", true));
else
out.write(constructLink(offset+steps, next, null , false));


out.write("</ul>");
out.write("</nav>");
} catch (java.io.IOException ex) {
throw new JspException("Error in Paginator tag", ex);
}
}


private String constructLink(int page, String text, String className, boolean disabled) {
StringBuilder link = new StringBuilder("<li");
if (className != null) {
link.append(" class=\"");
link.append(className);
link.append("\"");
}
if(disabled)
link.append(">").append("<a href=\"#\">"+text+"</a></li>");
else
link.append(">").append("<a href=\""+uri+"?offset="+page + "\">"+text+"</a></li>");
return link.toString();
}

public String getUri() {
return uri;
}

public void setUri(String uri) {
this.uri = uri;
}

public int getOffset() {
return offset;
}

public void setOffset(int offset) {
this.offset = offset;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

public int getMax() {
return max;
}

public void setMax(int max) {
this.max = max;
}

public String getPrevious() {
return previous;
}

public void setPrevious(String previous) {
this.previous = previous;
}

public String getNext() {
return next;
}

public void setNext(String next) {
this.next = next;
}

public int getSteps() {
return steps;
}

public void setSteps(int steps) {
this.steps = steps;
}

}

list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tag" uri="/WEB-INF/taglibs/customTaglib.tld"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="/css/bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="/css/font-awesome.min.css" />
<title>| Ekiras</title>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span> <span
class="icon-bar"></span> <span class="icon-bar"></span> <span
class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>

<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse"
id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-expanded="false">Dropdown
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
<li class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul></li>
</ul>
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-expanded="false">Dropdown
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid --> </nav>

<div class="container">
<div class="well">
<strong>List of Persons</strong>
</div>
<table class="table table-stripped">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
</tr>
<c:forEach items="${persons}" var="person" varStatus="itr">
<tr>
<td>${offset + itr.index +1 }</td>
<td>${person.name }</td>
<td>${person.age }</td>
</tr>
</c:forEach>
</table>
<tag:paginate max="15" offset="${offset}" count="${count}"
uri="/person/list" next="&raquo;" previous="&laquo;" />
</div>


<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/bootstrap.min.js"></script>
</body>
</html>

This is how you can do pagination using bootstrap style in spring hibernate mvc application.