반응형
Hibernate HQL 및 Cretreia
특정 데이터베이스를 조회하는 도구인 Hibernate에서는 HQL과 Creteria를 이용해서 쿼리를 작성해 DB에 접근할 수 있다. 그에 관련하여 주요 사용되는 쿼리와 기능들을 정리한 코드를 첨부했다.
Main에 특정 함수를 호출하면 결과를 확인해 볼 수 있다....는 데이터베이스에 같은 컬럼이 있어야겠지만...
기본적인 CRUD와 Where, Group by 등 쿼리들을 정리해보았다.
* 소스 코드의 맨 밑에 있는 getAllClasses함수는 특정 패키지 안에 있는 클래스 리스트를 출력해주는 함수로 Java의 Reflection과 함께 사용하면 된다.
Database Table
총 4개의 테이블이다.
public class Employee
private Integer id;
private Integer age;
private Date birthday;
private String name;
public class Employeeentity
private Integer id;
private String email;
private String firstName;
private String lastName;
public class Imagewrapper
private int id;
private byte[] data; // Blob 컬럼이다!
private String imageName;
public class TblZipcode
private int seq;
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bldg;
private String stBunji;
private String edBunji;
소스 코드
package org.power21.Property;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.log4j.PropertyConfigurator;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.LogicalExpression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.power21.hibernate.data.Employee;
import org.power21.hibernate.data.Employeeentity;
import org.power21.hibernate.data.Imagewrapper;
import org.power21.hibernate.data.TblZipcode;
import org.power21.hibernate.util.HibernateUtil;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// PropertyConfigurator.configure(System.getProperty("user.dir") + "\\log4j.properties");
new Main().DefaultFunc();
// Class[] list = new Main().getAllClasses("org.power21.hibernate.data"); // 특정 패키지 클래스 리스트 조회
}
private void DefaultFunc() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); // 트랜잭션 시작
// add new Employee object
Employee emp = new Employee();
emp.setName("James");
emp.setAge(21);
emp.setBirthday(new Date());
session.save(emp); // insert
Integer empId = emp.getId(); // PK로 지정된 아이디 가져오기
// empId와 일치하는 요소 가져오기
Employee emp1 = (Employee) session.load(Employee.class, empId);
System.out.println(emp1.getName() + " / " + emp1.getAge() + " / " + emp1.getBirthday());
// Criteria 사용방법
// 컬럼 별로 SELECT를 진행하거나, WHERE과 같은 조건이 필요할 경우 Criteria를 사용한다.
// 해당 테이블(클래스)에 있는 모든 요소 가져오기 => SELECT * FROM
Criteria crit = session.createCriteria(Employee.class);
List<Employee> empList = crit.list();
// 출력
for (Employee e : empList) {
System.out.println(e.getName() + " / " + e.getAge() + " / " + e.getBirthday());
}
// 컬럼 별로 가져오기 => SELECT ID, AGE, BIRTHDAY, NAME FROM
// 여기서 AS는 컬럼 이름을 특정하게 명명하는 것과 같다
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.id().as("id")); // PK
projectionList.add(Projections.property("age").as("age")); // 일반 컬럼
projectionList.add(Projections.property("birthday").as("birthday"));
projectionList.add(Projections.property("name").as("name"));
Criteria crit1 = session.createCriteria(Employee.class);
crit1.setProjection(projectionList);
crit1.setResultTransformer(new AliasToBeanResultTransformer(Employee.class));
List<Employee> empList1 = crit.list();
// 현재 테이블에 저장된 카운트 가져오기 SELECT COUNT(*) FROM
Criteria crit2 = session.createCriteria(Employee.class);
crit2.setProjection(Projections.rowCount());
List<Employee> empList2 = crit2.list();
// SELECT * FROM EMPLOYEE ORDER BY ID DESC
Criteria crit3 = session.createCriteria(Employee.class);
crit3.addOrder(Order.desc("id"));
List<Employee> empList3 = crit3.list();
// WHERE문 사용은 Restrictions을 사용한다.
// SELECT * FROM EMPLOYEE WHERE name = James
Criteria crit4 = session.createCriteria(Employee.class);
crit4.add(Restrictions.eq("name", "James"));
// SELECT * FROM EMPLOYEE WHERE ID = 1
Criteria crit5 = session.createCriteria(Employee.class);
crit5.add(Restrictions.idEq(5)); // PK컬럼 기준으로 검색
// SELECT * FROM EMPLOYEE WHERE name like 'Ja%'
Criteria crit6 = session.createCriteria(Employee.class);
crit6.add(Restrictions.like("name", "Ja", MatchMode.START)); // 'Ja%'
session.getTransaction().commit();
HibernateUtil.shutdown();
}
private void LogicalExpress() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); // 트랜잭션 시작
// 하이버 네이트는 기본적으로 And연산자가 사용되고, Or연산자가 필요할 경우 아래와 같이 LogicalExpression을 사용하면 된다.
Criteria crit = session.createCriteria(Employee.class);
Criterion price = Restrictions.gt("id", 3); // 3보다 큰
Criterion name = Restrictions.like("name", "Mik%"); // Like 'Mik%'
LogicalExpression orExp = Restrictions.or(price, name);
crit.add(orExp);
crit.add(Restrictions.ilike("description", "blocks%"));
List results = crit.list();
session.getTransaction().commit();
HibernateUtil.shutdown();
}
private void DisjunctionFunc() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); // 트랜잭션 시작
// 조건 연산이 많아질 경우마다 LogicalExpression을 사용하는 것은 불편하기 때문에
// Conjunction 또는 Disjunction 클래스를 사용해 한꺼번에 추가할 수 있도록 한다.
// Conjunction은 메소드에 추가한 조건을 AND로 연결
// Disjunction은 메소드에 추가한 조건을 OR로 연결
Criteria crit = session.createCriteria(Employee.class);
Criterion priceLessThan = Restrictions.lt("id", 3);
Criterion mouse = Restrictions.ilike("name", "James", MatchMode.ANYWHERE); // ilike는 대소문자를 구분하지 않는 조건이다.
Criterion browser = Restrictions.ilike("name", "Mikiy", MatchMode.ANYWHERE);
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(priceLessThan);
disjunction.add(mouse);
disjunction.add(browser);
crit.add(disjunction);
List results = crit.list();
session.getTransaction().commit();
HibernateUtil.shutdown();
}
private void resultSetFunc() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); // 트랜잭션 시작
// 모든 행을 가져올 필요 없이 가져오는 행수를 지정할 수 있다
Criteria crit = session.createCriteria(Employee.class);
crit.setFirstResult(1); // 첫번째에 해당하는 로우 1개만 가져오기
crit.setMaxResults(20); // 최대 20개까지만 가져오기
List<Employee> results = crit.list();
// 리스트가 아닌 단일 객체도 uniqueResult로 가져올 수 있다.
crit.setMaxResults(1);
Employee product = (Employee) crit.uniqueResult();
session.getTransaction().commit();
HibernateUtil.shutdown();
}
private void Save2() {
Session sessionOne = HibernateUtil.getSessionFactory().openSession();
sessionOne.beginTransaction();
// add new Employee object
Employee emp = new Employee();
emp.setName("Lokesh");
emp.setAge(23);
emp.setBirthday(new Date());
sessionOne.save(emp);
// Store the employee id generated for future use
Integer empId = emp.getId();
sessionOne.getTransaction().commit();
// load methods
Session sessionTwo = HibernateUtil.getSessionFactory().openSession();
sessionTwo.beginTransaction();
// first load method exam
Employee emp1 = (Employee) sessionTwo.load(Employee.class, empId);
System.out.println(emp1.getName() + " - " + emp1.getAge() + " - " + emp1.getBirthday());
sessionTwo.getTransaction().commit();
/***********************************************************/
Session sessionThree = HibernateUtil.getSessionFactory().openSession();
sessionThree.beginTransaction();
// second load() method example
Employee emp2 = (Employee) sessionThree.load("org.power21.hibernate.data.Employee", empId);
System.out.println(emp2.getName() + " - " + emp2.getAge() + " - " + emp2.getBirthday());
sessionThree.getTransaction().commit();
HibernateUtil.shutdown();
}
private void Save3() {
Session sessionOne = HibernateUtil.getSessionFactory().openSession();
sessionOne.beginTransaction();
// Create new Employee object
Employeeentity emp = new Employeeentity();
emp.setId(1);
emp.setFirstName("Lokesh");
emp.setLastName("Gupta");
// Save employee
sessionOne.save(emp);
System.out.println("출력 :: " + sessionOne.get(Employeeentity.class, "Lokesh"));
sessionOne.getTransaction().commit();
sessionOne.close();
HibernateUtil.shutdown();
}
// Blob 데이터 Save
private void BlobSave() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
File file = new File("C:\\Users\\naru3\\Desktop\\20200306_100119.png");
byte[] imageData = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(imageData);
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Imagewrapper image = new Imagewrapper();
image.setImageName("test.jpeg");
image.setData(imageData);
session.save(image); // Save the data
session.getTransaction().commit();
HibernateUtil.shutdown();
}
// Blob 데이터 Read
private void BlobReading() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Imagewrapper imgNew = (Imagewrapper) session.get(Imagewrapper.class, 0);
byte[] bAvatar = imgNew.getData();
try {
FileOutputStream fos = new FileOutputStream("C:\\Users\\naru3\\Desktop\\temp\\test.png");
fos.write(bAvatar);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
session.getTransaction().commit();
HibernateUtil.shutdown();
}
private void selectProjectionList(Session sess) {
Criteria crit = sess.createCriteria(TblZipcode.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.id().as("seq")); // id() == PK
projectionList.add(Projections.property("zipcode").as("zipcode"));
projectionList.add(Projections.property("stBunji").as("stBunji"));
projectionList.add(Projections.property("edBunji").as("edBunji"));
crit.setProjection(projectionList);
crit.setResultTransformer(new AliasToBeanResultTransformer(TblZipcode.class));
List<TblZipcode> zipcodeList = crit.list();
for (TblZipcode zipcode : zipcodeList) {
System.out.println(zipcode.getDong());
}
}
// 패키지 안에 있는 클래스 리스트를 출력해주는 함수
public Class[] getAllClasses(String pckgname) {
try {
ArrayList classes = new ArrayList();
// Get a File object for the package
File directory = null;
try {
directory = new File(Thread.currentThread().getContextClassLoader()
.getResource(pckgname.replace('.', '/')).getFile());
} catch (NullPointerException x) {
System.out.println("Nullpointer");
throw new ClassNotFoundException(pckgname + " does not appear to be a valid package");
}
if (directory.exists()) {
// Get the list of the files contained in the package
String[] files = directory.list();
for (int i = 0; i < files.length; i++) {
// we are only interested in .class files
if (files[i].endsWith(".class")) {
// removes the .class extension
classes.add(Class.forName(pckgname + '.' + files[i].substring(0, files[i].length() - 6)));
System.out.println(files[i]);
}
}
} else {
System.out.println("Directory does not exist");
throw new ClassNotFoundException(pckgname + " does not appear to be a valid package");
}
Class[] classesA = new Class[classes.size()];
classes.toArray(classesA);
return classesA;
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("null");
return null;
}
}
DefaultFunc()함수의 출력 결과
James / 21 / Thu Mar 12 16:35:06 KST 2020
James / 21 / 2020-03-06 13:16:35.0
James / 21 / 2020-03-06 13:18:32.0
James / 21 / 2020-03-06 13:19:20.0
James / 21 / 2020-03-06 13:22:00.0
James / 21 / 2020-03-06 14:32:36.0
James / 21 / 2020-03-12 16:07:15.0
James / 21 / 2020-03-12 16:07:46.0
James / 21 / 2020-03-12 16:20:26.0
James / 21 / 2020-03-12 16:21:47.0
James / 21 / 2020-03-12 16:24:46.0
James / 21 / 2020-03-12 16:24:52.0
James / 21 / Thu Mar 12 16:35:06 KST 2020
참고 사이트
https://howtodoinjava.com/hibernate-tutorials/
반응형
'Database > Hibernate' 카테고리의 다른 글
[Java] Hibernate Database 연결 방법 (0) | 2020.04.02 |
---|---|
[Java] Hibernate 설치 방법 (0) | 2020.03.06 |