/*
* Copyright 2011-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package kr.debop4j.access.test.repository;
import com.mysema.query.jpa.hibernate.HibernateUpdateClause;
import kr.debop4j.access.model.organization.Department;
import kr.debop4j.access.model.organization.DepartmentMember;
import kr.debop4j.access.model.organization.Employee;
import kr.debop4j.access.model.organization.QEmployee;
import kr.debop4j.data.hibernate.repository.IHibernateDao;
import kr.debop4j.data.hibernate.unitofwork.UnitOfWorks;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.criterion.*;
import org.hibernate.sql.JoinType;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* kr.debop4j.access.test.repository.CriteriaSampleTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 6. 15. 오후 6:26
*/
@Slf4j
@Transactional
public class CriteriaSampleTest extends RepositoryTestBase {
@Autowired
IHibernateDao hibernateDao;
@Test
@Transactional(readOnly = true)
public void simpleWhere() {
DetachedCriteria dc = DetachedCriteria.forClass(Employee.class);
dc.add(Restrictions.eq("name", "Smith"));
Employee employee = hibernateDao.findUnique(Employee.class, dc);
log.info("Employee=[{}]", employee);
dc.add(Restrictions.gt("age", 40));
employee = hibernateDao.findUnique(Employee.class, dc);
log.info("Employee=[{}]", employee);
}
@Test
@Transactional(readOnly = true)
public void joinSample() {
DetachedCriteria dc = DetachedCriteria.forClass(Employee.class);
dc.add(Restrictions.eq("name", "Smith"))
.createAlias("company", "c", JoinType.INNER_JOIN)
.add(Restrictions.eq("c.code", "KTH"));
Employee employee = hibernateDao.findFirst(Employee.class, dc);
log.info("Employee=[{}]", employee);
}
@Test
@Transactional(readOnly = true)
public void groupingTest() {
DetachedCriteria dc = DetachedCriteria.forClass(Employee.class);
dc.createAlias("company", "c")
.createAlias("empGrade", "eg")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("c.code"))
.add(Projections.groupProperty("eg.code"))
.add(Projections.rowCount()));
List loaded = dc.getExecutableCriteria(hibernateDao.getSession()).list();
log.info("Group by = [{}]", loaded);
}
@Test
@Transactional
public void deleteTest() {
DetachedCriteria dc = DetachedCriteria.forClass(Employee.class);
dc.createAlias("empGrade", "eg")
.add(Restrictions.eq("eg.code", "GRD001"));
hibernateDao.deleteAll(Employee.class, dc);
}
@Test
public void updateTest() {
QEmployee employee = QEmployee.employee;
// rename customers name Bob to Bobby
new HibernateUpdateClause(getCurrentSession(), employee)
.set(employee.name, "Bobby")
.where(employee.name.eq("Bob"))
.execute();
}
@Test
@Transactional(readOnly = true)
public void subqueriesTest() {
DetachedCriteria memberSizeDc = DetachedCriteria.forClass(DepartmentMember.class);
memberSizeDc.setProjection(Projections.projectionList()
.add(Projections.groupProperty("department"))
.add(Projections.rowCount(), "count"))
.addOrder(Order.desc("count"));
Object[] members = (Object[]) memberSizeDc.getExecutableCriteria(hibernateDao.getSession()).setMaxResults(1).uniqueResult();
if (members != null) {
Long departmentId = (Long) members[0];
DetachedCriteria dc = DetachedCriteria.forClass(Department.class);
dc.add(Restrictions.eq("id", departmentId));
dc.getExecutableCriteria(UnitOfWorks.getCurrentSession()).list();
}
}
@Test
@Transactional(readOnly = true)
public void subqueriesTest2() {
DetachedCriteria memberSizeDc = DetachedCriteria.forClass(DepartmentMember.class);
memberSizeDc.setProjection(Projections.projectionList()
.add(Projections.groupProperty("department"))
.add(Projections.rowCount(), "count"));
DetachedCriteria dc = DetachedCriteria.forClass(Department.class);
dc.add(Subqueries.propertyEq("id", memberSizeDc));
}
}