기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[Java] Hibernate HQL, Cretreia 사용  방법
Database/Hibernate

[Java] Hibernate HQL, Cretreia 사용 방법

2020. 3. 12. 16:35
반응형
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/

 

Hibernate Tutorial - HowToDoInJava

Hibernate Tutorial for beginners and experienced developers. Learn hibernate annotations, mappings, caches, configuration, HQL and validation with examples.

howtodoinjava.com

 

 

반응형
저작자표시 변경금지 (새창열림)

'Database > Hibernate' 카테고리의 다른 글

[Java] Hibernate Database 연결 방법  (0) 2020.04.02
[Java] Hibernate 설치 방법  (0) 2020.03.06
    'Database/Hibernate' 카테고리의 다른 글
    • [Java] Hibernate Database 연결 방법
    • [Java] Hibernate 설치 방법
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바