용어 뜻:
출처:
named-query: 현재 코드 내에 선언한 Entity를 기준으로 쿼리를 날린다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!--?xml version="1.0" encoding="UTF-8"?-->
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" version="2.0">
<named-query name="Inter.findByAlal2">
<query>select i from Inter i where i.internameko = ?1</query>
</named-query>
<named-native-query name="Inter.findByAlal" result-class="sample.jpa.Inter">
<query>select a.inter_seq, a.inter_name_ko, a.inter_name_en from tb_inter a where a.inter_name_ko = ?</query>
</named-native-query>
</entity-mappings>
| cs |
이렇게 xml을 사용해서 직접 입력하거나
1
2
3
4
5
6
7
|
@Entity @Table(name="tb_inter")
@NamedQuery(name = "User.findByAlal2",
query = "select i from Inter i where i.internameko = ?1")
public class Inter {
....
}
| cs |
Entity 클래스에 선언 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Repository
public interface EmpRepository extends CrudRepository<Emp, Long> {
@Query(nativeQuery=true, value=" select * from emp where emp_name = :empName ")
public Emp findByName(@Param("empName") String empName);
@Transactional //수정될 때는 트랜잭셔널 추가 - delete/update☆
@Modifying
@Query(nativeQuery=true, value=" update emp set EMP_DEL_FLG = 1 where emp_name = :empName ") public void deleteByName(@Param("empName") String empName);
public void deleteByName(@Param("empName") String empName);
}
| cs |
@NamedQuery: Entity에 선언한다.
@Query: Repository에 선언한다. findBy나 deleteBy, removeBy를 사용하지 않고 쿼리문을 입력할 때 사용한다.
@Query([nativeQuery=true], [value="쿼리를 입력한다."])
이렇게 nativeQuery를 true로 주면 서로 다른 RDB간 방언을 사용 가능하다.
nativeQuery가 false일 경우 JPQL(JPA Query Language)를 사용해야 한다.
value에 쿼리를 넣으면 그 쿼리를 실행한다.
쿼리를 미입력시 orm.xml(쿼리를 입력하는 xml 파일) 에서 함수명으로 명명된 쿼리를 찾아서 실행한다.
named-native-query: db에 직접 쿼리를 날린다. 따라서 result class를 필요로 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<named-native-query name="도메인클래스명.정의된메소드명"
` <!-- name은 정의된 메소드명과 같아야 한다. -->
result-class="패키지명.도메인패키지.도메인클래스명">
<!-- 리턴 클래스와 같아야 한다. 전체 경로를 적어줘야 한다. -->
<query>
<![CDATA[
<!-- 쿼리를 입력한다. -->
]]></query>
</named-native-query>
</entity-mappings>
| cs |
named-native-query 예제에서 사용한 xml의 위치는
src/main/resources/META-INF/orm.xml이다.
META-INF도 생성해 줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<named-native-query name="Emp.findByName" result-class="com.example.domain.Emp"> <!-- 도메인클래스명이 리턴 클래스이다. -->
<query>
<![CDATA[
select * from emp where emp_name = :empName
]]>
</query>
</named-native-query>
</entity-mappings>
| cs |
페이퍼 세상 살아요, 2016-10-25, http://kimpaper.blogspot.kr/2015/10/spring-jpa-namedquery-namednativequery.html
댓글
댓글 쓰기