2016년 10월 31일 월요일
2016년 10월 28일 금요일
[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][스프링JPA강좌]Querydsl오라클쿼리시퀀스(Sequence)사용예문
[스프링JPA강좌]Querydsl오라클쿼리시퀀스(Sequence)사용예문
SQLExpressions.nextval("시퀀스이름")
아래와 같이 TYPE을 줄 수도 있다.
SQLExpressions.nextval(Integer.class, "시퀀스이름")
SQLExpressions.nextval("시퀀스이름")
아래와 같이 TYPE을 줄 수도 있다.
SQLExpressions.nextval(Integer.class, "시퀀스이름")
[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][Querydsl오라클SQL팁]오라클ROWID,ROWNUM,LEVEL,SYSDATE같은의사칼럼사용하기
[Querydsl오라클SQL팁]오라클ROWID,ROWNUM,LEVEL,SYSDATE같은의사칼럼사용하기
com.mysema.query.sql.oracle.OracleGrammar 클래스를 사용하면 되는데
static 필드로 선언되어 있고 아래처럼 사용하면 된다.
아래는 오라클의 계층형 쿼리를 Querydsl을 이용하여 구현 하였다.
[계층형질의에서 LEVEL 예제]
List<Tuple> rows = query
.select(StringExpressions.lpad(
Expressions.stringTemplate("' '").stringValue(),
OracleGrammar.level.subtract(1).multiply(2), ' ')
.concat(emp.ename),
emp.sal, emp.deptno)
.startWith(emp.ename.eq("KING"))
.connectByPrior(emp.empno.eq(emp.mgr))
.from(emp)
.fetch();
select lpad(' ',(level - 1) * 2,' ') || EMP.ENAME, EMP.SAL, EMP.DEPTNO
from EMP EMP
start with EMP.ENAME = 'KING'
connect by prior EMP.EMPNO = EMP.MGR
--------------------------------------------------------------------
[ROWNUM 예제]
List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
.from(myemp1).innerJoin(mydept1)
.on(myemp1.deptno.eq(mydept1.deptno))
.where(OracleGrammar.rownum.lt(6)).fetch();
select MYEMP1.ENAME, MYDEPT1.DNAME
from MYEMP1 MYEMP1
inner join MYDEPT1 MYDEPT1
on MYEMP1.DEPTNO = MYDEPT1.DEPTNO
where rownum < 6
com.mysema.query.sql.oracle.OracleGrammar 클래스를 사용하면 되는데
static 필드로 선언되어 있고 아래처럼 사용하면 된다.
아래는 오라클의 계층형 쿼리를 Querydsl을 이용하여 구현 하였다.
[계층형질의에서 LEVEL 예제]
List<Tuple> rows = query
.select(StringExpressions.lpad(
Expressions.stringTemplate("' '").stringValue(),
OracleGrammar.level.subtract(1).multiply(2), ' ')
.concat(emp.ename),
emp.sal, emp.deptno)
.startWith(emp.ename.eq("KING"))
.connectByPrior(emp.empno.eq(emp.mgr))
.from(emp)
.fetch();
select lpad(' ',(level - 1) * 2,' ') || EMP.ENAME, EMP.SAL, EMP.DEPTNO
from EMP EMP
start with EMP.ENAME = 'KING'
connect by prior EMP.EMPNO = EMP.MGR
--------------------------------------------------------------------
[ROWNUM 예제]
List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
.from(myemp1).innerJoin(mydept1)
.on(myemp1.deptno.eq(mydept1.deptno))
.where(OracleGrammar.rownum.lt(6)).fetch();
select MYEMP1.ENAME, MYDEPT1.DNAME
from MYEMP1 MYEMP1
inner join MYDEPT1 MYDEPT1
on MYEMP1.DEPTNO = MYDEPT1.DEPTNO
where rownum < 6
[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][스프링JPA강좌,Querydsl,오라클DB에서 쿼리타입Q타입생성하기,SQLQueryFactory]
[스프링JPA강좌,Querydsl,오라클DB에서 쿼리타입Q타입생성하기,SQLQueryFactory] Spring Data JPA에서 오라클DB에 직접 쿼리하기 위해 오라클DB쪽 테이블을 자바쪽 프로젝트에 쿼리타입으로 생성해야 하는데, 그와 관련된 메이븐 설정 및 방법 입니다.
첨부 파일 참조하세요~
감사합니다.
첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=147
첨부 파일 참조하세요~
감사합니다.
첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=147
[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][스프링DATAJPA팁]Querydsl4.0.8오라클쿼리WITH구문오류!!(Querydsl,오라클쿼리강좌)
[스프링DATAJPA팁]Querydsl4.0.8오라클쿼리WITH구문오류!!(Querydsl,오라클쿼리강좌)
아래와 같은 SQL 쿼리를 만들기 위해
(WITH문을 이용하여 MYEMP1, MYDEPT1 테이블에서 부서명, 부서별직원평균급여 구하기)
with myemp2 as (
select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal
from TEST.MYEMP1 MYEMP1
group by MYEMP1.DEPTNO)
select MYDEPT1.DNAME, myemp2.SAL
from MYDEPT1
inner join myemp2
on MYDEPT1.DEPTNO = myemp2.DEPTNO
다음과 같이 Querydsl4.0.8 버전에서 작성했는데
QMyemp1 myemp1 = new QMyemp1.myemp1;
QMyemp1 myemp2 = new QMyemp1("myemp2");
List<Tuple> depts = queryFactory.query()
.with(myemp2,
SQLExpressions
.select(myemp1.deptno, myemp1.sal.avg().as("sal"))
.from(myemp1)
.groupBy(myemp1.deptno))
.select(mydept1.dname, myemp2.sal)
.from(mydept1)
.innerJoin(myemp2).on(mydept1.deptno.eq(myemp2.deptno))
.fetch();
Querydsl4.0.8 버전에서는 WITH구문이 다음과 같이 해석된다.
(innerjoin에서 WITH구문에서 만든 myemp2와 조인을 해야되는데
myemp1 테이블과 조인하여 이상한 결과가 나오게 된다. )
with myemp2 as (
select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal
from TEST.MYEMP1 MYEMP1
group by MYEMP1.DEPTNO)
select MYDEPT1.DNAME, myemp2.SAL
from MYDEPT1
join MYEMP1 myemp2
on MYDEPT1.DEPTNO = myemp2.DEPTNO
Querydsl 버전을 4.0.9 이상으로 올리자.
잘 동작된다.
아래와 같은 SQL 쿼리를 만들기 위해
(WITH문을 이용하여 MYEMP1, MYDEPT1 테이블에서 부서명, 부서별직원평균급여 구하기)
with myemp2 as (
select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal
from TEST.MYEMP1 MYEMP1
group by MYEMP1.DEPTNO)
select MYDEPT1.DNAME, myemp2.SAL
from MYDEPT1
inner join myemp2
on MYDEPT1.DEPTNO = myemp2.DEPTNO
다음과 같이 Querydsl4.0.8 버전에서 작성했는데
QMyemp1 myemp1 = new QMyemp1.myemp1;
QMyemp1 myemp2 = new QMyemp1("myemp2");
List<Tuple> depts = queryFactory.query()
.with(myemp2,
SQLExpressions
.select(myemp1.deptno, myemp1.sal.avg().as("sal"))
.from(myemp1)
.groupBy(myemp1.deptno))
.select(mydept1.dname, myemp2.sal)
.from(mydept1)
.innerJoin(myemp2).on(mydept1.deptno.eq(myemp2.deptno))
.fetch();
Querydsl4.0.8 버전에서는 WITH구문이 다음과 같이 해석된다.
(innerjoin에서 WITH구문에서 만든 myemp2와 조인을 해야되는데
myemp1 테이블과 조인하여 이상한 결과가 나오게 된다. )
with myemp2 as (
select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal
from TEST.MYEMP1 MYEMP1
group by MYEMP1.DEPTNO)
select MYDEPT1.DNAME, myemp2.SAL
from MYDEPT1
join MYEMP1 myemp2
on MYDEPT1.DEPTNO = myemp2.DEPTNO
Querydsl 버전을 4.0.9 이상으로 올리자.
잘 동작된다.
[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][Spring Data JPA,Querydsl강좌]오라클SQL조인,ROWNUM,OracleGrammar.rownum
[Spring Data JPA,Querydsl강좌]오라클SQL조인,ROWNUM,OracleGrammar.rownum
아래 두가지 방법 모드 가능하다.
// List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
// .from(myemp1).innerJoin(mydept1)
// .on(myemp1.deptno.eq(mydept1.deptno)).limit(5).fetch();
List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
.from(myemp1).innerJoin(mydept1)
.on(myemp1.deptno.eq(mydept1.deptno))
.where(OracleGrammar.rownum.lt(6)).fetch();
-------------------------------------------------
select MYEMP1.ENAME, MYDEPT1.DNAME
from MYEMP1 MYEMP1
inner join MYDEPT1 MYDEPT1
on MYEMP1.DEPTNO = MYDEPT1.DEPTNO
where rownum < 6
아래 두가지 방법 모드 가능하다.
// List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
// .from(myemp1).innerJoin(mydept1)
// .on(myemp1.deptno.eq(mydept1.deptno)).limit(5).fetch();
List<Tuple> rows = queryFactory.select(myemp1.ename, mydept1.dname)
.from(myemp1).innerJoin(mydept1)
.on(myemp1.deptno.eq(mydept1.deptno))
.where(OracleGrammar.rownum.lt(6)).fetch();
-------------------------------------------------
select MYEMP1.ENAME, MYDEPT1.DNAME
from MYEMP1 MYEMP1
inner join MYDEPT1 MYDEPT1
on MYEMP1.DEPTNO = MYDEPT1.DEPTNO
where rownum < 6
2016년 10월 27일 목요일
[자바학원,스프링학원추천]JPA 상속관계 매핑(@MappedSuperclass, @Inheritance,@DiscriminatorValue,@DiscriminatorColumn
JPA에서 상속관계 매핑 방법에 대해 설명한 자료입니다.
RDB는 객체지향처럼 상속이 존재하지 않으며 대신 Super Type, Sub Type 이라는 개념이 존재한다. 슈퍼/서브 타입 논리모델을 물리적인 테이블로 변환할 때는 하나의 통합된 테이블로 표시(단일 테이블 전략)하거나, 각각 테이블로 별도로 두어 조회할 때 조인을 이용하거나 서브타입만 테이블로 변환을 하는 방법이 있다.
[오라클학원,SQL기초학원추천_탑크리에듀]스칼라서브쿼리(Scalar Subquery)
오라클 SQL초보자를 위한 스칼라 서브쿼리에 대한 간단한 설명자료 입니다. 데이터 건수가 많지 않다면 조인보다 가끔 스칼라 서브쿼리가 더 효율적일 때가 있죠. 참조하세요.
[자바교육,스프링교육,IT실무교육추천]스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링 WEB MVC에서 컨트롤러에서 예외처리하는 방법에 관해 설명한 PPT 입니다.
@ExceptionHandler는 스프링 컨트롤러에서 정의한 메소드에서 기술한 예외가 발생되면 자동으로 받아낼 수 있는데 이를 이용하여 컨트롤러에서 발생하는 예외를 View단 JSP등으로 보내서 처리할 수 있으며@ControllerAdvice는 스프링3.2 이상에서 사용가능하며 @Controller 나 스프링 4.0이상에서 지원하는 @RestController 에서 발생하는 예외 등을 catch하는 기능을 가지고 있으며 클래스 위에 @ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 기술합니다. 스프링4.0이상에서는 특정한 컨트롤러만 지정해서 캐치할 수 있죠
[자바교육,JPA교육,스프링교육_탑크리에듀][스프링부트JPA강좌]Querydsl,오라클시퀀스(Sequence)예제
[스프링부트JPA강좌]Querydsl,오라클시퀀스(Sequence)예제
감사합니다.
@Override
public Long insertMyemp1(String ename, Long sal, String deptno) {
////////////////////////////////////////////////////////////////
// myemp1테이블에 insert, 오라클 시퀀스이용
// 시퀀스생성:create sequence seq_myemp1_empno start with 10000003
// select seq_myemp1_empno.nextval from dual;
// 시퀀스이름을 줄때 앞에스키마명까지 줘야한다. 아니면 ORA-02289 발생
//-------------------------------------------------------------
// insert into myemp1 (empno, ename, sal, deptno)
// values (test.seq_myemp1_empno, ?, ?, ?)
////////////////////////////////////////////////////////////////
Long cnt = queryFactory.insert(myemp1)
.columns(myemp1.empno, myemp1.ename, myemp1.sal, myemp1.deptno)
.values(SQLExpressions.nextval("test.seq_myemp1_empno"),ename,sal,deptno)
.execute();
return cnt;
}
------------------------------------------------------------------------
[로그]
10. insert into MYEMP1 (EMPNO, ENAME, SAL, DEPTNO)
values (test.seq_myemp1_empno.nextval, '오제이씨', 9999, '1')
20160304 21:14:54.194 [http-nio-8080-exec-7] INFO j.sqltiming - insert into MYEMP1 (EMPNO, ENAME, SAL, DEPTNO)
values (test.seq_myemp1_empno.nextval, '오제이씨', 9999, '1')
{executed in 255 msec}
감사합니다.
@Override
public Long insertMyemp1(String ename, Long sal, String deptno) {
////////////////////////////////////////////////////////////////
// myemp1테이블에 insert, 오라클 시퀀스이용
// 시퀀스생성:create sequence seq_myemp1_empno start with 10000003
// select seq_myemp1_empno.nextval from dual;
// 시퀀스이름을 줄때 앞에스키마명까지 줘야한다. 아니면 ORA-02289 발생
//-------------------------------------------------------------
// insert into myemp1 (empno, ename, sal, deptno)
// values (test.seq_myemp1_empno, ?, ?, ?)
////////////////////////////////////////////////////////////////
Long cnt = queryFactory.insert(myemp1)
.columns(myemp1.empno, myemp1.ename, myemp1.sal, myemp1.deptno)
.values(SQLExpressions.nextval("test.seq_myemp1_empno"),ename,sal,deptno)
.execute();
return cnt;
}
------------------------------------------------------------------------
[로그]
10. insert into MYEMP1 (EMPNO, ENAME, SAL, DEPTNO)
values (test.seq_myemp1_empno.nextval, '오제이씨', 9999, '1')
20160304 21:14:54.194 [http-nio-8080-exec-7] INFO j.sqltiming - insert into MYEMP1 (EMPNO, ENAME, SAL, DEPTNO)
values (test.seq_myemp1_empno.nextval, '오제이씨', 9999, '1')
{executed in 255 msec}
[자바교육,JPA교육,스프링교육_탑크리에듀][스프링JPA,Querydsl강좌]오라클SQL쿼리,NVL,SelfJoin,LeftJoin
[스프링JPA,Querydsl강좌]오라클SQL쿼리,NVL,SelfJoin,LeftJoin
첨부 파일 참조하세요.
감사합니다.
첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=143
첨부 파일 참조하세요.
감사합니다.
첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=143
[자바교육,JPA교육,스프링교육_탑크리에듀]#4.Spring부트,JPA,오라클연동게시판,리스트보기(리스트보기,레포지토리,서비스,컨트롤러,스프링부트메인, JSP, 페이징처리적용)
#4.Spring부트,JPA,오라클연동게시판,리스트보기(리스트보기,레포지토리,서비스,컨트롤러,스프링부트메인, JSP, 페이징처리적용),기존 MyBatis, Spring JDBC와 비교해보세요~
첨부 파일 참조하세요.
1. 게시판 리스트보기 설명 PDF
2. 게시판 리스트보기까지 전체 프로젝트 소스
다음 강좌 #5에서는 RestController, 부트스트랩을 통한 UI개선, AngulerJS를 적용하여클라이언트를 MVC형태로 개선해 보자!
열공하세요~ 감사합니다.
[자바교육,JPA교육,스프링교육_탑크리에듀]#3.스프링부트,Spring Data JPA게시판(모델클래스작성및테이블생성)
#3.스프링부트,Spring Data JPA게시판(모델클래스작성및테이블생성)
도메인 모델 객체 생성하기<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
n Jpa.board.model 패키지를 생성 후 엔티티 클래스를 만들자.
[Board.java]
package jpa.board.model;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
// 시퀀스의 시작값은 1
// 시퀀스의 기본 allocationSize는50, 번호가 50부터 생기므로 1로
@SequenceGenerator(name="BOARD_SEQ_GENERATOR",
sequenceName="BOARD_SEQ",
initialValue=1,
allocationSize=1)
public class Board {
// MySQL이라면 아래와같이 기술한다.
// @Id
// @GeneratedValue
// @Column(length=10)
// protected Integer id;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="BOARD_SEQ_GENERATOR")
@Column(length=10)
protected Integer id;
@Column(length=20, nullable=false)
protected String name;
@Column(length=20, nullable=false)
protected String passwd;
@Column(length=500, nullable=false)
protected String title;
@Column(length=4000, nullable=false)
protected String content;
//날짜기본형식 time, day, month, year 형태저장
@Column(nullable=false, columnDefinition = "date default sysdate")
@Temporal(TemporalType.TIMESTAMP)
protected Date regdate = new Date();
@Column(nullable=false, columnDefinition = "number(5) default 0")
protected Integer readcount = 0;
// 답변인경우 어느글의 답변인지 상위글번호
// 최상위글인 경우 자신의 글번호 동일하다.
// 리스트보기에서 정렬시 우선적으로 reply로 정렬
@Column(nullable=false, columnDefinition = "number(5)")
protected Integer reply = 0 ;
// 글아래 모든 답변들에 대해 reply_level과 관계없이 1씩 증가
@Column(nullable=false, columnDefinition = "number(5) default 0")
protected Integer replystep = 0;
// 1차,2차 답글인지 여부
// 하나의 글에 답변이 두개면 그 두답변은 reply_level이 같다.
// 리스트보기에서 reply_level에 따라 들여쓰기를 한다.
@Column(nullable=false,columnDefinition = "number(5) default 0", length=10)
protected Integer replylevel = 0;
}
n 프로젝트에서 마우스 우측버튼 -> Run As -> Spring Boot App로 실행 후 오라클쪽에 테이블이 생성되는 것을 확인하자.
피드 구독하기:
덧글 (Atom)