2016년 11월 30일 수요일

[닷넷,C#,기초학원,WPF학원,자마린학원추천](C#,닷넷기초강좌#8)쓰레드개념과 C#에서 멀티쓰레드로 프로그래밍 하는 방법

[C#강의,닷넷강의,WPF강의추천_탑크리에듀](C#,닷넷구조체동영상교육#7)구조체 개요 및 간단한 예제

[C#강의,닷넷강의,WPF강의추천_탑크리에듀](C#,닷넷구조체동영상교육#7)구조체 개요 및 간단한 예제

[자바강의,스프링강의,JPA강의추천_탑크리에듀][JPA,Querydsl강좌]JPA에서 QueryDSL4.X사용하기위해 JPAQuery,JPAQueryFactory인스턴스 생성방법예문

[JPA,Querydsl강좌]JPA에서 QueryDSL4.X사용하기위해 JPAQuery,JPAQueryFactory인스턴스 생성방법예문

첨부파일 참조하세요.


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

[자바강의,스프링강의,JPA강의추천_탑크리에듀][스프링JPA강좌]WEB MVC,@NamedQuery,@Query,메소드 이름을 통해 쿼리를 정의하는 예제(마리아DB실습)

[스프링JPA강좌]WEB MVC,@NamedQuery,@Query,메소드 이름을 통해 쿼리를 정의하는 예제(마리아DB실습)

다양한 형태의 Spring Data JPA 쿼리 예제를 실습해 보세요...

천천히 하나씩 따라 하시면서 스프링 Data JPA에 대해서 이해해 보세요~

감사합니다.

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

[자바강의,스프링강의,JPA강의추천_탑크리에듀][스프링JPA강좌]QueryDSL4.X,JPAQueryFactory쿼리예문(조인,서브쿼리,GroupBy,OrderBy,삭제,수정,조회) ,열심히공부하세요

[스프링JPA강좌]QueryDSL4.X,JPAQueryFactory쿼리예문(조인,서브쿼리,GroupBy,OrderBy,삭제,수정,조회) ,열심히공부하세요

감사합니다. 

아래 예문 참조하세요~ 

-------------------------------------------------------------------------------------------------------------------------- 

@Autowired 
JPAQueryFactory queryFactory;

////////////////////////////////// QueryDSL용 메소드 

@Override 
/* Emp 테이블에서 job을 조건으로 검색, 이름 내림차순으로 */ 
public List<Emp> selectByJobOrderByEnameDesc(String job) {
List<Emp> emps = queryFactory.selectFrom(emp) 
              .where(emp.job.eq(job)) 
              .orderBy(emp.ename.desc()).fetch(); 
return emps; 


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

return affectedRow; 


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

return affectedRow; 


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


/* Emp 테이블에서 job별로 GroupBy후 그룹별 급여평균추출 
  단 그룹의 급여 합계가 주어진 합보다 큰경우 */ 
@Override 
public List<Tuple> selectSalAvgGroupbyJob(Long sumSal) { 
List<Tuple> result = queryFactory 
.select(emp.job, emp.sal.avg()) 
            .from(emp) 
            .groupBy(emp.job) 
            .having(emp.sal.sum().gt(sumSal)) 
            .fetch(); 

return result; 


/* Emp 테이블에서 입력받은 부서원 이름 및 부서명을 추출하는데 Dept 테이블과 조인 
  부서코드를 안가지는 사원은 추출되지 않는다 */ 
@Override 
public List<Tuple> selectEmpEnameDnameJoinDept(Long deptno) { 
List<Tuple> emps = queryFactory 
.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() { 
QEmp e = new QEmp("e"); 

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

return emps; 


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

List<Emp> emps = queryFactory.selectFrom(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() { 
QEmp e = new QEmp("e"); 

List<Emp> emps = queryFactory.selectFrom(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) { 
QEmp e = new QEmp("e"); 

List<Emp> emps = queryFactory.selectFrom(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() { 
List<Emp> emps = queryFactory.selectFrom(emp) 
.orderBy(emp.sal.desc()) 
.limit(3) 
.fetch();

return emps; 


/* Dept 테이블에서 사원이 한명이라도 존재하는 부서명추출, 서브쿼리 */ 
@Override 
public List<String> selectDeptExistsEmp() { 
List<String> depts = queryFactory.select(dept.dname).from(dept) 
.where(JPAExpressions 
      .selectFrom(emp)
      .where(emp.dept.deptno.eq(dept.deptno)).exists() 
            ) 
.fetch();

return depts; 
}

[자바강의,스프링강의,JPA강의추천_탑크리에듀][스프링JPA,Querydsl강좌예제]QueryDSL4.X,JPAQueryFactory실습,조인,서브쿼리,입력,수정,삭제,orderBy,groupBy,inner join,JPAUdateClause,JPADeleteClause

[스프링JPA,Querydsl강좌예제]QueryDSL4.X,JPAQueryFactory실습,조인,서브쿼리,입력,수정,삭제,orderBy,groupBy,inner join,JPAUdateClause,JPADeleteClause 

 이전 예제의 QueryDSL 작성 부분만 JPAQueryFactory를 사용하여 구현해보자. 다른점은 JPAQueryFactory 인스턴스 생성을 위해 스프링 부트 메인에 @Bean으로 정의한 부분과 EmpRepositoryImpl의 쿼리 작성 부분이 조금 다르고 groupBy 처리 메소드가 추가되었다. 

첨부파일 참조 하세요.

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

[C#교육,WPF교육,XAML교육,IT실무교육추천][강좌소개] C# WPF, XAML 프로그래밍 교육과정안내

탑크리에듀의 본 과정은 체계적 학습과 다양한 개발 방법을 익힘으로 WPF 개발의 기술적 기반을 마련하고자 하며 배운 기술들을 융합하여 간단한 미니프로젝트로 응용프로그램을 개발해 봄으로써 WPF 개발에 대한 자신감을 심어 드립니다.

2016년 11월 28일 월요일

[자바강의,스프링강의,JPA강의추천_탑크리에듀][JPA팁,JPa강좌]orphanRemoval = true vs DDL의 On Delete Cascade vs CascadeType.REMOVE 차이점

[JPA팁,JPa강좌]orphanRemoval = true vs DDL의 On Delete Cascade vs CascadeType.REMOVE 차이점

먼저 예문을 보자.

@Entity
class Emp {
@OneToOne(orphanRemoval=true)
    private Addr addr;
}
Emp 엔티티가 삭제될 때 참조가 끊어진 연관된 Addr 엔티티도 삭제하라는 의미이며 DB에서도 삭제되는데 참조(연결)가 끊어진 Addr 객체는 DB에서도 삭제된다는 뜻이다.

@Entity
class Emp {
@OneToOne(cascade=CascadeType.REMOVE)
    private Addr addr;
}
Emp 엔티티가 삭제될 때 연관된 Addr 엔티티도 삭제하라는 의미이며 DB에서도 삭제된다.


@Entity
class Emp {
@OneToMany(orphanRemoval=true)
    private List<Addr> addr;
}
addresses 컬렉션에서 Addr 객체가 제거되는 경우 DB에서도 삭제하라는 의미.

orphanRemoval은 JPA2.0 이상에서 지원하는 것으로 ORM 스펙, JPA 레벨에서의 정의이고 On Delete Cascade는 DBMS 레벨에서 작동되며 하는 일은 같다. orphanRemoval @OneToMany 연관에서 부모 엔티티의 컬렉션 등에서 자식 엔티티가 삭제될 때 참조가 끊어지므로 DB 레벨에서도 삭제되고 @OneToOne연관에서 엔티티가 삭제될 때 연관된 엔티티가 참조가 끊어지므로 DB에서 삭제된다즉 참조연결이 끊어진(Disconnected엔티티를 같이 삭제하라는 의미로 Owner 객체와 참조가 끊어진 객체들을 정리할 때 유용하다.

cascade=CascadeType.REMOVE는 연결이 끊어진다고 해서 자동 삭제되는 것은 아니고 명시적으로 연관 엔티티가 삭제될 때 같이 삭제하라는 영속성 전이와 관련된 옵션이다.

반면 On Delete Cascade는 DB레벨에서 부모 테이블의 레코드가 삭제될 때 자식레코드도 같이 삭제하라는 의미이다.

[자바강의,스프링강의,JPA강의추천_탑크리에듀]JPA강좌,QueryDSL4.X 조회, 수정, 삭제, update, delete 배치쿼리, JPADeleteClause, JPAUpdateClause

JPA강좌,QueryDSL4.X 조회수정삭제, update, delete 배치쿼리, JPADeleteClause, JPAUpdateClause

n  데이터 조회 쿼리작성
JPAQuery 직접 생성하는 경우

import static model.QEmp.emp;

@PersistenceContext
EntityManager em;

JPAQuery<?> query = new JPAQuery<Void>(em);
Emp emp = query.select(emp).from(emp)
           .where(emp.empno.eq(7369))
           .fetchOne();  //한건만 추출

JPAQueryFactory를 이용한다면
(내부적으로 JPAQuery 인스턴스를 가지고 있다.)

[스프링 설정 파일에서 JPAQueryFactory를 빈으,로 등록]
@Bean
public JPAQueryFactory queryFactory() {
           //return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
           return new JPAQueryFactory(em);
}

[Repository 구현체에서]

import static model.QEmp.emp;

@Autowired
JPAQueryFactory queryFactory;

Emp emp = queryFactory.selectFrom(emp)
           .where(emp.empno.eq(7369))
           .fetch();


n  수정
[JPAQuery 또는 JPAQueryFactory 두방법 모두 가능]
Long affectedRow  = new JPAUpdateClause(em, emp)
           .where(emp.empno.eq(empno))
           .set(emp.ename, newEname)
           .execute();        

[JPAQueryFactory 방법]
// update 메소드 내부에서 JPAUpdateClause를 사용한다.
Long affectedRow = queryFactory.update(emp)
           .where(emp.empno.eq(empno))
           .set(emp.ename, newEname)
           .execute();


n  삭제
[JPAQuery 또는 JPAQueryFactory 두방법 모두 가능]

Long affectedRow =new JPADeleteClause(em, emp)
        .where(emp.job.eq(job))
.execute();                 

[JPAQueryFactory 방법]
// delete 메소드 내부에서 JPADeleteClause를 사용한다.
Long affectedRow = queryFactory.delete(emp)
    .where(emp.job.eq(job))
    .execute();