2016년 7월 29일 금요일

(방학특강) [스프링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
}

예제는 첨부 파일 참조하세요.

(방학특강) [JPA강좌교육]사용자정의레포지토리작성법,No property queryDSL found -스프링실무교육학원


(방학특강) [JPA강좌교육]사용자정의레포지토리작성법,No property queryDSL found -스프링실무교육학원

(방학특강) [JPA강좌, QueryDSL설정하기] - 스프링실무교육학원

(방학특강) [JPA강좌, QueryDSL설정하기] - 스프링실무교육학원



----------------------------------------------------------------
QueryDSL 3.X 버전이면 다음과 같이 MAVEN pom.xml에 설정해야 한다.
----------------------------------------------------------------

1. pom.xml 의존성 추가

메이븐 프로젝트의 의존 설정에 다음을 추가한다.

<dependency>
  <groupId>com.mysema.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>${querydsl.version}</version>
  <scope>provided</scope>
</dependency>    
    
<dependency>
  <groupId>com.mysema.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
  <version>${querydsl.version}</version>
</dependency>
 

다음으로 메이븐 APT 플러그인을 설정한다.

<project>
  <build>
  <plugins>
    ...
    <plugin>
      <groupId>com.mysema.maven</groupId>
      <artifactId>apt-maven-plugin</artifactId>
      <version>1.0.9</version>
      <executions>
        <execution>
          <goals>
            <goal>process</goal>
          </goals>
          <configuration>
            <outputDirectory>target/generated-sources/java</outputDirectory>
            <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
          </configuration>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
  </build>
</project>

----------------------------------------------------------------
QueryDSL 4.X 버전이면 다음과 같이 MAVEN pom.xml에 설정해야 한다.(버전 : 4.0.8)
--------------------------------------------------------------

[pom.xml]에서 붉은색 부분을 추가하자.

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<querydsl.version>4.0.8</querydsl.version>
</properties>


<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>${querydsl.version}</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
  <version>${querydsl.version}</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>

다음으로 메이븐 APT 플러그인을 설정한다.

<project>
  <build>
  <plugins>
    ...
    <plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
    ...
  </plugins>
  </build>
</project>



2. 플러그인의 <execution>에서 오류가 발생하는 경우 STS의 설정파일인 STS.ini 파일에서 -VM 옵션을 추가하자.

-vm
C:\Program Files\Java\jdk1.8.0_31\bin\javaw.exe
-vmargs


3. STS 재시작 후 -> MAVEN -> UPDATE PROJECT

4. 타겟 경로 지정

도메인 클래스(모델객체를 샘플로 만들면) outputDirectory로 지정한 target/generated-sources 위치에 Q로 시작하는 쿼리타입들이 생기고 이 위치가 자동으로 소스경로에 포함되는 데 안되었다면 아래처럼 하자.

폴더에서 마우스 우측 -> Build Path -> use as Source Folder 

or

BuildPath -> Configure Build Path의 SOURCE탭에  target/generated-source/java 경로를 추가하자.



(방학특강)JBoss Hibernate Tools를 이용한 JPA Entity 코드 생성-송석원 -스프링실무교육학원


(방학특강)JBoss Hibernate Tools를 이용한 JPA Entity 코드 생성-송석원 -스프링실무교육학원

JBoss Hibernate Tools 사용 매뉴얼입니다.
PDF 파일을 다운로드 후 참고하세요.

(방학특강)[JPA강좌,스프링부트]JPA, Spring Data JPa, WEB MVC 간단 예제 -스프링실무교육학원


(방학특강)[JPA강좌,스프링부트]JPA, Spring Data JPa, WEB MVC 간단 예제 -스프링실무교육학원

Spring Data JPA Simple Example

n  Spring Boot, WEB MVC, Spring Data JPA, Maria DB를 이용하여 간단히 예제를 만들어 보자.
 첨부파일 참조하세요~

감사합니다.

(방학특강)[스프링JPA교육강좌]엔티티매핑(Entity Mapping)어노테이션,@Entity, @Table, @Column,@Basic,@Lob,@Enumerated,@Temporal- 스프링실무교육학원


(방학특강)[스프링JPA교육강좌]엔티티매핑(Entity Mapping)어노테이션,@Entity, @Table, @Column,@Basic,@Lob,@Enumerated,@Temporal,@Transient,@Access, - 스프링실무교육학원
열공하세요~

2016년 7월 28일 목요일

(방학특강)[JPA강좌, 엔티티, Entity,JPQL이란] -스프링실무교육학원


(방학특강)[JPA강좌, 엔티티, Entity,JPQL이란] -스프링실무교육학원

엔티티(Entity)

n  JPA의 엔티티는 테이블을 객체로 표현한 자바 클래스이다.  이 엔티티의 인스턴스는 테이블의 행을 나타내고 대체로 다른 엔티티와 관계를 맺고 있고 이러한 관계(오브젝트/관계메타데이터는 클래스에 어노테이션(@ManyToOne, @OneToOne, @ManyToOne, @ManyToMany)을 기술하거나 XML 파일 등에서 설정할 수 있다이러한 엔티티는 구현 클래스 또는 추상 클래스가 될 수 있으며 특성 또는 필드를 사용하여 상태를 관리한다.
n  JPQL(Java Persistence Query Language)은 지속적 엔티티를 저장하는 데 사용되는 메커니즘과 독립적으로 지속적 엔티티에서 검색을 정의하는 데 사용되는데  데이터베이스와 관련된 SQL을 사용하지 않고 오브젝트를 검색하는 언어이다.
n  엔티티의 4가지 생명주기
ü  비영속 객체(new/transient) : new 키워드를 생성한 엔티티 객체를 말하며 Managed 상태가 아닌 것을 말한다.
ü  영속 객체(managed) : new 이후 perist 메소드를 이용해서 저장한 경우 또는 DB의 데이터를 find query등으로 조회한 경우인데 영속성 컨텍스에 저장된 상태이다.
ü  삭제 객체(removed) : 영속객체 즉 Managed 상태인 객체를 remove 메소드로 삭제한 경우작업이 커밋되는 시점에 DB에 동기화 된다.
ü  준영속 객체(detached) : 트랜잭션이 커밋되었거나 clear, flush 메소드가 실행된 경우 모든 영속객체의 상태는 준영속 상태(Detached) 상태가 된다영속성 컨텍스트에서 분리된 상황이며 merge 메소드로 다시 영속객체가 될 수 있다.

n  엔티티(영속클래스, Persistent Class) JPA가 생성할 때 기본 생성자를 이용하므로 반드시 기본 생성자를 가져야 하며 식별자 프로퍼티(@Id)가 반드시 존재 해야 한다.
n  final 클래스는 엔티티가 될 수 없다. Proxy를 생성할 때 자식클래스 형태로 만드는데 final 클래스는 상속되지 않는 클래스이므로 불가하다만약 final 메소드를 가진 클래스를 엔티티로 사용하려면 명시적으로 lazy=“false”로 설정해서 Proxy 생성을 막아야 한다.
n  하이버네이트는 기본적으로 자바빈의 프로퍼티를 테이블의 칼럼에 매핑하며 getter/setter 메소드를 자동 인식한다.
n  하이버네이트에서는 기본적으로 동일한 세션에서만 엔티티 객체에 대해 데이터베이스 동일성 과 자바 동일성을 보장하므로 여러 세션에서 같은 객체로 인식되게 하기 위해서는 equals(), hashCode()를 오버라이딩 해야 한다.특히 엔티티(영속 클래스)를 컬렉션 등에 담을 때는 반드시 위해서는 equals(), hashCode()를 구현해야 한다.
n  @Entity, @Table 어노테이션을 이용하여 엔티티와 테이블을 매핑한다.

(방학특강)[JPA강좌]스프링부트,JPA,WEB MVC예제(마리아DB예제) - 스프링실무교육학원


(방학특강)[JPA강좌]스프링부트,JPA,WEB MVC예제(마리아DB예제) - 스프링실무교육학원

간단히 Spring Boot및 WEB MVC형태로 Spring Data JPA를 Maria DB를 이용한 예제 입니다.
참조하세요~

[IT실무고급교육★탑크리에듀][오라클PL/SQL,NETSTED TABLE, TABLE TYPE]예제


[오라클PL/SQL,NETSTED TABLE, TABLE TYPE]예제

SQL> CREATE TYPE emp_type AS OBJECT
    (
            empno            NUMBER(4),
            ename            VARCHAR2(50)
    );
    /

유형이 생성되었습니다.

SQL> CREATE TYPE emp_type_table AS TABLE OF emp_type;
    /

유형이 생성되었습니다.

SQL> desc emp_type
 이름                                      널?      유형
 ----------------------------------------- -------- -------------
 EMPNO                                              NUMBER(4)
 ENAME                                              VARCHAR2(50)

SQL> desc emp_type_table

 emp_type_table TABLE OF EMP_TYPE
 이름                                      널?      유형
 ----------------------------------------- -------- -------------
 EMPNO                                              NUMBER(4)
 ENAME                                              VARCHAR2(50)

SQL> select text
    from user_source
    where name = 'EMP_TYPE';

TEXT
-----------------------------------------------
TYPE emp_type AS OBJECT
    (
            empno            NUMBER(4),
            ename            VARCHAR2(50)
    );


SQL> select text
  2      from dba_source
  3      where name = 'EMP_TYPE_TABLE';

TEXT
------------------------------------------------
TYPE emp_type_table AS TABLE OF emp_type;


SQL> CREATE TABLE dept_nt (
  2      deptno      NUMBER(4),
  3      dname        VARCHAR2(20),
  4      emps        EMP_TYPE_TABLE)
  5      NESTED TABLE emps STORE AS emps_table;

테이블이 생성되었습니다.

SQL> desc dept_nt
 이름                                      널?      유형
 ----------------------------------------- -------- --------------
 DEPTNO                                            NUMBER(4)
 DNAME                                              VARCHAR2(20)
 EMPS                                              EMP_TYPE_TABLE

SQL> desc emps_table
 이름                                      널?      유형
 ----------------------------------------- -------- --------------
 EMPNO                                              NUMBER(4)
 ENAME                                              VARCHAR2(50)


SQL> SELECT table_name, column_name, data_type, data_length
FROM dba_tab_cols
WHERE table_name = 'DEPT_NT';

TABLE_NAME COLUMN_NAME        DATA_TYPE          DATA_LENGTH
---------- ------------------- ------------------- -----------
DEPT_NT     EMPS         EMP_TYPE_TABLE       16
DEPT_NT     SYS_NC0000300004$ RAW               16
DEPT_NT     DNAME         VARCHAR2       20
DEPT_NT     DEPTNO         NUMBER               22

SQL> SELECT table_name, table_type_name,parent_table_column
    FROM dba_nested_tables
    WHERE table_name = 'EMPS_TABLE';

TABLE_NAME      TABLE_TYPE_NAME            PARENT_TABLE_COLUMN
---------------- -------------------------- -----------------------
EMPS_TABLE   EMP_TYPE_TABLE         EMPS

SQL> select table_name,column_name,data_type
    from dba_nested_table_cols
    where table_name = 'EMPS_TABLE';

TABLE_NAME          COLUMN_NAME                    DATA_TYPE
-------------------- ------------------------------ ------------
EMPS_TABLE     SYS_NC_ROWINFO$             EMP_TYPE
EMPS_TABLE     ENAME                     VARCHAR2
EMPS_TABLE     EMPNO                     NUMBER
EMPS_TABLE     NESTED_TABLE_ID             RAW

SQL> INSERT INTO dept_nt (deptno, dname, emps)
    VALUES (10, '영업부',emp_type_table());

1 row created.

SQL> INSERT INTO TABLE(SELECT emps FROM dept_nt WHERE deptno = 10)
  VALUES (1, '1길동');

SQL> INSERT INTO TABLE(SELECT emps FROM dept_nt WHERE deptno = 10)
  VALUES (2, '2길동');

SQL> INSERT INTO TABLE(SELECT emps FROM dept_nt WHERE deptno = 10)
  VALUES (3, '3길동');


SQL> select t1.deptno, t1.dname,t2.* from dept_nt t1, table(t1.emps) t2;

DEPTNO  DNAME  EMPNO    ENAME
-------------------------------
10 영업부 1 1길동
10 영업부 2 2길동
10 영업부 3 3길동

[IT실무고급교육★탑크리에듀][서브쿼리/조인/GROUP BY/EXISTS SQL퀴즈예제]


[서브쿼리/조인/GROUP BY/EXISTS SQL퀴즈예제]

- 프로그래밍언어별(programming_name) 프로그래머 수를 출력하세요.
  (모든 프로그래밍 언어 표시, programming_name 오름차순)


PROGRAMMING_NAME        COUNT(B.PROGRAMMER_ID)
----------------------- ----------------------
C                              1
C#                            1
JAVA                          2
PYTHON                        0


select a.programming_name, count(b.programmer_id)
  from programming a left outer join programmer b
on a.programming_id = b.programming_id
group by a.programming_name
order by programming_name asc

select a.programming_name, count(b.programmer_id)
  from programming a, programmer b
where a.programming_id = b.programming_id(+)
group by a.programming_name
order by a.programming_name asc

- NOT EXISTS를 사용하여 개발자가 한명도 없는 프로그래밍언어이름(programming_name)을 출력하세요.

PROGRAMMING_NAME
-------------------
PYTHON

select programming_name
  from programming a
where not exists (select 1 from programmer b
                  where a.programming_id = b.programming_id)
                 
- NOT IN을 이용하여 프로그래머가 한명도 없는 프로그래밍언어이름(programming_name)을 출력하세요.                   

PROGRAMMING_NAME
-------------------
PYTHON

select programming_name
  from programming a
where a.programming_id not in (select programming_id from programmer b
                                where a.programming_id = b.programming_id)
                 

- JAVA 프로그래머의 이름을 출력하세요.

PROGRAMMER_NAME
---------------
김길동
헐길동

select programmer_name
  from programmer
where  programming_id =  (select programming_id from programming
                          where programming_name = 'JAVA')


- 프로그래밍이름(programming_name)별, product의 수, product의 최대가격(price)을
  출력하세요.
 
 PNAME            CNT    MAXPRICE
---------------- ---------- ----------
C#                1        3000
JAVA              2        2000
C                  2        3000


- 프로그래머 경력3년 이상인 사람이 만든 Product을 구입한 고객의 이름을 출력하세요.

CUSTOMER_NAME
---------------
4번고객

select customer_name
  from customer a1
where customer_id in (
                      select customer_id
                        from product_order a,
                            product b,
                            programmer c
                      where a.product_id = b.product_id
                        and c.programmer_id = b.programmer_id
                        and c.career >= 3                   
                    )


- 프로그래밍언어별, product_name별 주문건수 합계를 출력하세요.

programming_name  product_name  cnt
------------------------------------------------------
C#             ANDROID APP     2
JAVA           SHOPPING MALL       7
C               iOS APP             1
JAVA             ERP                     1

select programming_name,
      product_name,
      sum(cnt) cnt
from  programming a, programmer b, product c, product_order d
where  a.programming_id = b.programming_id
  and  b.programmer_id = c.programmer_id
  and  c.product_id = d.product_id
group by programming_name, product_name


- product_name별, 주문년도별 주문금액 합계를 출력하세요.
  (단 주문금액합계가 5000 이상인 데이터만,
  주문내역이 없는 product_name도 출력 하세요.)
 
PRODUCT_NAME        NVL(TO_ NVL(TO_C
-------------------- ------- --------
ANDROID APP          2015      6,000
SHOPPING MALL        2016      14,000 
 
select product_name,
      nvl(to_char(order_date,'yyyy'),'no data'),
      nvl(to_char(sum(price*cnt),'999,999'), 0)
from  product a, product_order b
where a.product_id = b.product_id(+)
group by product_name, to_char(order_date,'yyyy')
having sum(price*cnt) >= 5000

- 세로축은 product_name별, 가로축은 주문년도를 "2015년", "2016년"으로 구성하여
  product_name별, 년도별 주문건수를 집계하세요.(주문건수가 없으로 0으로 표시)

product_name  2015년 2016년
---------------------------
ERP             0   1
ANDROID APP     2   0
SHOPPING MALL   0   7
iOS APP         1   0 

select product_name,
      nvl(sum(decode(to_char(order_date,'yyyy'),'2015',cnt)),0) "2015년",
      nvl(sum(decode(to_char(order_date,'yyyy'),'2016',cnt)),0) "2016년"
  from product a, product_order b     
where  a.product_id = b.product_id
group by product_name
     


- product_name별 구입한 고객의 이름을 콤마(,)로 구분하여 하나의 칼럼에 출력하세요.
  (고객의 이름은 오름차순 정렬)

product_name  customer_name
---------------------------
ANDROID APP   4번고객
ERP           1번고객
SHOPPING MALL 2번고객,3번고객
iOS APP       5번고객

select product_name,
      listagg(customer_name, ',') within group(order by customer_name) customer_name
 from  customer a, product b, product_order c     
where  a.customer_id = c.customer_id
  and  b.product_id = c.product_id
group by product_name