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 중국어 웹사이트를 주목하세요!