2016년 12월 14일 수요일

[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링JPA강좌]@OneToMany컬렉션매핑,List,@OrderColumn예제,1:N 연관관계

[스프링JPA강좌]@OneToMany컬렉션매핑,List,@OrderColumn예제,1:N 연관관계

 N:1 양방향관계에서 1쪽에서 N쪽으로의 방향성 또는 1:N 단반향에서는  컬렉션을 참조하므로 Set, List, Map을 사용할 수 있다.

 1:N 관계는 잘 사용되지 않으며, 1:N 단방향 보다는 M:1 양방향 관계를 사용하는 것이 좋다.

 List는 순서가 있고 중복을 허락하는 자료구조 이므로 자료들의 순서를 알 수 있고, 정렬이 가능하다. 자료들의 순서(인덱스)를 알기 위해서는 별도 인덱스 칼럼이 정의되어야 한다.(반대쪽 테이블인 Emp쪽에 해당 칼럼이 생성된다.)

 Map은 Key, Value 쌍으로 자료를 저장하는데 key설정을 위해 @MapKey를 사용하며, 실제 테이블의 칼럼을 지정할 때는 @MapKeyColumn을 사용한다.

@Entity
@Table(name = "dept")
public class Dept {
        @Id
        @GeneratedValue
        private Long deptno;
        private String dname; 
        @OneToMany(mappedBy=“dept”, cascade=CascadeTYpe.ALL)
        @OrderBy(“dname DESC”)
        @OrderColumn(name=“emp_index”)
         private List<Emp> emps;
        //getter, setter
}

@Entity
@Table(name = "emp")
public class Emp {
        @Id
        @GeneratedValue
        private Long empno;
        private String ename;
        //@JoinColumn은 외래키매핑용
        @ManyToOne
        @JoinColumn(name="deptno")
        private Dept dept;
        //getter, setter
}

예제는 첨부 파일 참조하세요.
첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=218

[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링JPA강좌]ManyToMany양방향 개요및 예제,@ManyToMany

[스프링JPA강좌]ManyToMany양방향 개요및 예제,@ManyToMany

- 첨부 파일 참조 하세요

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=217

[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링JPA강좌,교육]QueryDSL4.X,서브쿼리,조인,exists(),max()예문 입니다.

[스프링JPA강좌,교육]QueryDSL4.X,서브쿼리,조인,exists(),max()예문 입니다.

롬복(Lombok)설치는다음 URL 참조 

http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=561 

  

마리아 DB 설치는다음 URL 참조 

http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=524 



1. Emp, Dept 엔티티는 다음과 같다. 

@Entity 
@Getter 
@Setter 
@NamedQuery(name="Emp.findBySalNamed", 
            query="select e from Emp e where e.sal > :sal") 
public class Emp { 
@Id 
@GeneratedValue 
private Long empno; 
private String ename; 
private String job; 
private Long sal; 

@ManyToOne 
@JoinColumn(name = "deptno")
private Dept dept; 


@Entity 
@Getter 
@Setter 
@NoArgsConstructor 
public class Dept  { 
@Id 
@GeneratedValue 
private Long deptno; 

@Column(unique=true) 
private String dname; 

public Dept(String dname) { 
this.dname = dname; 



2. 예문 

@Override 
// Emp 테이블에서 job을 조건으로 검색, 이름 내림차순으로 
public List<Emp> selectByJobOrderByEnameDesc(String job) { 
JPAQuery<?> query = new JPAQuery<Void>(em); 
QEmp emp = QEmp.emp;
List<Emp> emps = query.select(emp).from(emp) 
              .where(emp.job.eq(job)) 
              .orderBy(emp.ename.desc()).fetch(); 
return emps; 


@Override 
@Transactional 
/* job을 입력받아 EMP 삭제 */ 
public void deleteByJob(String job) { 
QEmp emp = QEmp.emp; 
new JPADeleteClause(em, emp) 
    .where(emp.job.eq(job)) 
    .execute();


// 사번과 새이름을 입력받아 이름을 변경 
@Override 
@Transactional 
public void updateByEmpno(Long empno, String newEname) { 
QEmp emp = QEmp.emp; 
new JPAUpdateClause(em, emp) 
.where(emp.empno.eq(empno)) 
.set(emp.ename, newEname) 
.execute();


// job을 검색조건으로 ename, job 추출 
@Override 
public List<Tuple> selectEnameJobByEmpno(Long empno) { 
JPAQuery<?> query = new JPAQuery<Void>(em); 
QEmp emp = QEmp.emp; 
//Multi Column Select 
    List<Tuple> result = query.select(emp.ename, emp.job).from(emp) 
                .where(emp.empno.eq(empno)) 
                .fetch(); 
    
return (List<Tuple>)result; 


// Emp 테이블 1번부서원 이름 및 부서명을 추출하는데 Dept 테이블과 조인 
  부서코드를 안가지는 사원은 추출되지 않는다 
@Override 
public List<Tuple> selectEmpEnameDnameJoinDept(Long deptno) { 
JPAQuery<?> query = new JPAQuery<Void>(em); 
QEmp emp = QEmp.emp; 
QDept dept = QDept.dept; 

List<Tuple> emps = query.select(emp.ename, dept.dname).from(emp) 
.innerJoin(emp.dept, dept) 
.where(emp.dept.deptno.eq(deptno)) 
.fetch(); 

return emps; 


// Emp 테이블에서 최대급여 사원 추출, 서브쿼리 
@Override 
public List<Emp> selectEmpMaxSal() { 
JPAQuery<?> query = new JPAQuery<Void>(em); 
QEmp emp = QEmp.emp; 
QEmp e = new QEmp("e"); 

List<Emp> emps = query.select(emp).from(emp) 
.where(emp.sal.eq( 
JPAExpressions.select(e.sal.max()).from(e))) 
.fetch();

return emps; 


// 부서별 최대급여받는 사원 추출 , 서브쿼리 
@Override 
public List<Emp> selectEmpMaxSalOfDept() { 
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp; 
QEmp e = new QEmp("e"); 

List<Emp> emps = query.select(emp).from(emp) 
        .where(emp.sal.eq( 
JPAExpressions 
      .select(e.sal.max()).from(e)
      .where(emp.dept.deptno.eq(e.dept.deptno)) 
))
.fetch();

return emps; 


// 자신이 속한 부서의 평균급여보다 급여가 많은 사원추출 ,서브쿼리 
@Override 
public List<Emp> selectEmpGreaterThanAvgSal() { 
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp; 
QEmp e = new QEmp("e"); 

List<Emp> emps = query.select(emp).from(emp) 
.where(emp.sal.gt( 
JPAExpressions 
      .select(e.sal.avg()).from(e)
      .where(emp.dept.deptno.eq(e.dept.deptno)) 
))
.fetch();

return emps; 


// 입력받은 사원과 급여가 같은 사원추출 , 서브쿼리 
// 입력받은 사원은 출력안함                      
@Override 
public List<Emp> selectEmpEqualsEmpno(Long empno) { 
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp; 
QEmp e = new QEmp("e"); 

List<Emp> emps = query.select(emp).from(emp) 
.where(emp.sal.eq( 
JPAExpressions 
      .select(e.sal).from(e)
      .where(e.empno.eq(empno)) 
))
.where(emp.empno.ne(empno)) 
.fetch();

return emps; 


// Emp 테이블에서 급여상위 3명 추출 , 서브쿼리 
@Override 
public List<Emp> selectEmpMaxSalTop3() { 
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp; 

List<Emp> emps = query.select(emp).from(emp) 
.orderBy(emp.sal.desc()) 
.limit(3) 
.fetch();

return emps; 


// Dept 테이블에서 사원이 한명이라도 존재하는 부서추출, 서브쿼리 
@Override 
public List<Dept> selectDeptExistsEmp() { 
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp; 
QDept dept = QDept.dept;

List<Dept> depts = query.select(dept).from(dept) 
.where(JPAExpressions 
      .selectFrom(emp)
      .where(emp.dept.deptno.eq(dept.deptno)).exists() 
            ) 
.fetch();

return depts; 
}

[자바교육,스프링교육,JPA교육학원_탑크리에듀][JPA에러]Cannot create TypedQuery for query with more than one return using requested result type

[JPA에러]Cannot create TypedQuery for query with more than one return using requested result type


[엔티티]

@Entity
@Getter
@Setter
@NamedQuery(name="Emp.findBySalNamed",
            query="select e.empno, e.ename from Emp e where e.sal > :sal")
public class Emp { 
@Id
@GeneratedValue
private Long empno;
private String ename;
private String job;
private Long sal;
@ManyToOne
@JoinColumn(name = "deptno")
private Dept dept;
}

자바코드에서...

List<Emp> result = em.createNamedQuery("Emp.findBySalNamed", Emp.class)
                .setParameter("sal", 2000)
                .getResultList();

JPQL 또는 NamedQuery의 쿼리구문에서 리턴결과 타입을 클래스타입으로 하고 위의 경우처럼 
필드명을 쓴 경우 타입이 여러개라는 오류가 발생한다.
(Cannot create TypedQuery for query with more than one return using requested result type)


Select되는 결과 타입을 Emp.class로 했으면 다음과 같이 NamedQuery를 수정해야 한다.
@NamedQuery(name="Emp.findBySalNamed",
            query="select e from Emp e where e.sal > :sal")

물론 JPQL을 직접사용했을 때도 동일하다.

String someJPQL = "select e.empno, e.ename from Emp e where e.sal > :sal";
em.createQuery(someJPQL, Media.class);

=>

String someJPQL = "select e from Emp e where e.sal > :sal";


[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링부트,JPA,Querydsl강좌]@NamedQuery, @Query,메소드이름기반쿼리,페이징처리예제(WEB MVC)-스프링JPA기본교육이론.실습

[스프링부트,JPA,Querydsl강좌]@NamedQuery, @Query,메소드이름기반쿼리,페이징처리예제(WEB MVC)-스프링JPA기본교육이론.실습

§Spring Boot, Spring Data JPA, Spring WEB MVC,

QueryDSL @NamedQuery, @Query, 메소드 이름으로 쿼

리생성페이징처리 기본예제를 마리아DB를 이용하여 작

성해 보자.

첨부파일 참조하세요. 

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=214

[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링JPA강좌,JPQL,쿼리메소드강좌]JPQL,쿼리메소드,네임드쿼리실습,롬복(lombok), JpaRepository, JPA Query Method, JPA교육,마리아DB

[스프링JPA강좌,JPQL,쿼리메소드강좌]JPQL,쿼리메소드,네임드쿼리실습,롬복(lombok), JpaRepository, JPA Query Method, JPA교육,마리아DB

spring boot 및 spring data jpa를 이용하여 , JPA Query Method(NamedQuery)를 실습하는 간단한 예제 입니다.

DB는 마리아 DB를 사용했구요,

참조하세요~

감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=213

[자바교육,스프링교육,JPA교육학원_탑크리에듀][JPA강좌,이론/실습]@ManyToMany입력,삭제,검색,수정,@OrderColumn,mappedBy,@JoinColumn,@JoinTable,엔티티매핑

[JPA강좌,이론/실습]@ManyToMany입력,삭제,검색,수정,@OrderColumn,mappedBy,@JoinColumn,@JoinTable,엔티티매핑

n  사원(Sawon), 취미(Hobby)는 다 : 다 관계이다사원은 여러 취미를 가질 수 있고하나의 취미 역시 여러 사원에 할당 될 수 있기 때문이다보통 관계형 DB에서는 다 : 다 관계는 1 :  : 1 로 나누어서 풀게 된다그러나 객체에서는 2개의 객체로 다 : 다 관계를 만드는데사원에서 취미를 컬렉션에 넣어 접근 가능하고반대로 취미에서도 사원들을 컬렉션에 넣어 접근하면 양쪽에서 접근이 가능하다.
n   : 다 매핑을 위해 @ManyToMany 어노테이션을 사용한다.

첨부파일 하셔서 매핑부터 CRUD 실습하세요.

감사합니다.~

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=212