>  기사  >  Java  >  Java의 Hibernate 프레임워크에서 SQL 문을 사용하는 방법에 대한 간략한 소개

Java의 Hibernate 프레임워크에서 SQL 문을 사용하는 방법에 대한 간략한 소개

高洛峰
高洛峰원래의
2017-01-23 11:32:541172검색

Hibernate에는 HQL 쿼리 구문이 있습니다. 하지만 우리는 SQL 문에 더 익숙합니다. 그렇다면 Hibernate가 SQL을 지원하도록 하려면 어떻게 해야 할까요? 우리는 이것에 대해 생각할 필요가 없습니다. Hibernate 팀이 이미 그것을 해냈습니다.
더 이상 고민하지 말고 예를 들어보겠습니다.

select * from t_user usr

위 내용은 말도 안되는 SQL문입니다. 우리는 Hibernate가 이 명령문을 실행하기를 원합니다. 우리는 무엇을 해야 합니까? 코드를 보세요:

Query query = session.createSQLQuery("select * from t_user usr");

그게 전부입니다. 모두가 나머지 일반적인 쿼리를 알아야 합니다.
그러면 쿼리가 완료되면 무엇이 반환되나요?

while(iter.hasNext()){
 Object[] objs = (Object[])iter.next();
 for (int i = 0; i < objs.length; i++) {
 System.out.print(objs[i]);
 }
 System.out.println();
}

반환된 각 결과는 Object[] 배열입니다.

이때 누군가 나와서 객체지향이라고 했습니다. 예, 객체 지향적입니다. 아쉽게도 방법이 없습니다.
계속 읽어보자:

아아아아

이거 보니 몇몇 아이들의 신발이 흔들리기 시작하는 것 같은데 저 교정장치는 뭔가요?
서두르지 말고 여유를 가지세요. 먼저 코드를 계속 살펴보겠습니다.

select {usr.*} from t_user usr

addEntity를 추가했다는 점이 이전과 다른 점을 알 수 있습니다.
API에 직접 가서 다음과 같은 일련의 설명을 보았습니다.

Query query = session.createSQLQuery("select {usr.*} from t_user usr").addEntity(TUser.class);

같은 것이 아닙니다. 본인만 사용할 수 있습니다.
첫 번째 매개변수는 테이블의 별칭을 참조합니다. 위 명령문과 마찬가지로 테이블의 별칭은 usr이므로 첫 번째 매개변수는 usr이고 두 번째 매개변수는 쿼리 결과를 매핑해야 하는 클래스를 나타냅니다. 여기에서는 TUser를 매핑 파일의 t_user 테이블에 매핑하므로 여기에는 물론 TUser가 있습니다. 그러다가 확인해 보니 SQL 문이 나왔고 결과는 TUser 유형이었습니다.
우리가 찾은 결과는 다음과 같습니다.

addEntity
SQLQuery addEntity(String tableAlias,
   Class entityType)
Declare a "root" entity
Parameters:
tableAlias - The SQL table alias
entityType - The java type of the entity to add as a root

물론 당신의 것은 나와 다를 것입니다. 움직이지 마세요.

모두 확인할 필요는 없을 수도 있습니다. 이때 필요한 것은 별칭을 설정하는 것뿐입니다:

org.hibernate.tutorial.domain6.TUser@198cb3d

필드의 별칭이 제거되더라도 프로그램에서는 여전히 동일합니다.

select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u

이는 간단하며 별로 할 말이 없습니다.

앞서 일부 팀에서는 구성 파일이 필요한 SQL 문을 코드에 작성하지 않도록 규정한다고 언급했습니다.
구성 파일에 다음을 추가할 수 있습니다.

Query query = session.createSQLQuery("select u.id as {usr.id},u.name as {usr.name},u.age as {usr.age} from t_user u").addEntity("usr",TUser.class);

여기서 엔터티 이름은 전체 패키지 이름이어야 합니다. 그렇지 않으면 오류가 보고됩니다. 여기에는 런타임에 addEntity를 추가할 필요가 없도록 테이블의 별칭과 클래스 이름을 지정하는 하위 태그 반환이 있습니다.
코드를 보세요:

<sql-query name="queryTUser">
 <return alias="usr" entity-name="org.hibernate.tutorial.domain6.TUser" />
 select {usr.*} from t_user usr where name=:name
</sql-query>


주로 구성 파일의 구성으로 인해 addEntity를 추가하지 않았습니다.
구성 파일에 구성된 경우 테이블 별칭과 클래스 이름을 지정하는 반환 하위 태그가 있어야 합니다. 이는 주로 우리가 진술을 읽을 때 반복적인 판단을 피하기 위한 것입니다.


우리는 오랫동안 별칭이 있는 테이블에 대해 이야기해 왔습니다. 테이블에 별칭이 없지만 반환된 결과를 개체에 캡슐화하려면 어떻게 해야 합니까?

Query query = session.getNamedQuery("queryTUser");
query.setParameter("name","shun");
List list = query.list();
Iterator iter = list.iterator();

매우 간단합니다. addEntity의 오버로드된 메서드 addEntity(Class clazz)를 호출하면 됩니다. 테이블 별칭이 필요 없이 클래스 이름만 제공하면 됩니다.

물론, Hibernate는 저장 프로시저도 지원합니다. 구성 파일에서 sql-query의 callable 속성을 true로 설정하기만 하면 됩니다. 이는 현재 저장 프로시저가 호출되지 않는다는 의미입니다. 저장 프로시저에 대해 많이 접해 봤기 때문에 앞으로 더 많은 것을 연구하고 모두와 함께 공부할 것입니다.

session.save 및 기타 해당 데이터 조작 메소드를 호출하면 최대 절전 모드의 내장 SQL 문으로 변환되지만 SQL 문의 형식을 직접 제어하려면 어떻게 해야 할까요?
Hibernate도 실제로 그런 생각을 했습니다.
매핑 파일에 직접 추가합니다:

select * from t_user usr

이는 클래스 태그 내에 하위 태그로 추가되어야 합니다. 여기서는 최대 절전 모드의 기본 명령문과 구별하기 위해 모두 대문자를 사용하고 다른 의미는 없습니다.
먼저 삽입 호출을 살펴보겠습니다.

<sql-insert>
 INSERT INTO T_USER (NAME,AGE) values (?,?)
 </sql-insert>
 <sql-update>
 UPDATE USER SET USER_NAME=?,AGE=? WHERE uSER_ID=?
</sql-update>

save를 호출할 때 Hibernate의 명령문은 다음과 같습니다.
Hibernate:

User user = new User();
user.setName("shun123123");
user.setAge(23);

우리가 구성한 sql-insert 태그의 명령문을 호출합니다.
업데이트 호출을 살펴보겠습니다.

INSERT INTO USER(USER_NAME,AGE) values(?,?)

save를 호출하면 자동으로 update가 호출됩니다. 이때 명령문은 다음과 같습니다.
Hibernate:

User user = (User)session.get(User.class,new Long(29));
user.setName("shun123123");
user.setAge(23);
session.save(user);

출력 명령문이 대문자로 표시된 것을 볼 수 있습니다. 이는 우리가 구성한 명령문이 호출된다는 의미입니다.

삭제문도 같은 방식으로 구성됩니다.

Java의 Hibernate 프레임워크에서 SQL 문을 사용하는 간단한 소개에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.