명명된 쿼리란 무엇입니까?
Hibernate를 사용하면 매핑 파일에 문자열 형태로 쿼리 문을 정의할 수 있습니다. 이 쿼리 방법을 명명된 쿼리라고 합니다.
명명된 쿼리를 사용하면 어떤 이점이 있나요?
Hibernate의 HQL을 사용하려면 Java 코드에 문자열 쿼리 문을 작성해야 하는 경우가 많기 때문에 HQL은 코드 간에 혼합되어 코드 가독성을 손상시킵니다. 명명된 쿼리를 사용하면 비즈니스 로직과 쿼리 문을 분리할 수 있어 쿼리에 집중할 수 있습니다. SQL 또는 HQL 코드는 애플리케이션 전체에 분산되어 있습니다.
명명된 쿼리를 사용하여 복잡한 쿼리를 처리할 수 있습니다.
명명된 쿼리를 구현하는 방법은 무엇입니까?
다음 방법을 소개합니다.
방법 1: 구성 파일의 <class/> 태그 아래에 쿼리 문을 선언합니다.
다음과 같이 코드 코드를 복사합니다 .
<최대 절전 모드 매핑>
<class name="com.test.bean.Student" table="student" 카탈로그="사용자">
<id name="id" type="integer">
<열 이름="ID" />
<생성기 />
</id>
<속성 이름="이름" 유형="문자열">
<열 이름="이름" 길이="11" />
</property>
<속성 이름="나이" 유형="정수">
<열 이름="나이" />
</property>
<속성 이름="섹스" 유형="문자열">
<열 이름="섹스" 길이="2" />
</property>
</class>
<!-- 쿼리문 정의-->
<쿼리 이름="findStudentByName">
<![CDATA[이름 = :name인 학생의 이름]]>
</쿼리>
</hibernate-mapping>
참고 : <![CDATA[ ]]>는 무엇을 의미하나요?
이것이 없으면 < > & 문자를 XML에 직접 저장할 수 없으며 이스케이프해야 함을 나타냅니다. 그러나 이 태그를 사용하면 이러한 기호를 이스케이프하지 않고 XML 문서에 저장할 수 있습니다. 이렇게 하면 XML 구문 분석 오류를 일으키는 예기치 않은 특수 기호를 방지할 수 있습니다.
다음과 같이 코드 코드를 복사합니다 .
공개 목록<학생> 쿼리(){
세션 세션 = HibernateSessionFactory.getSession();
쿼리 q = session.getNamedQuery("findStudentByName");
q.setString("이름", "장산");
List<학생> list = q.list();
반환 목록;
}
방법 2 : 구성 파일의 <class/> 태그에 쿼리문을 선언할 수도 있지만, Java 코드 호출 시 지정해야 합니다(패키지 + 클래스 + 구성 이름).
다음과 같이 코드 코드를 복사합니다 .
<최대 절전 모드 매핑>
<class name="com.test.bean.Student" table="student" 카탈로그="사용자">
<id name="id" type="integer">
<열 이름="ID" />
<생성기 />
</id>
<속성 이름="이름" 유형="문자열">
<열 이름="이름" 길이="11" />
</property>
<속성 이름="나이" 유형="정수">
<열 이름="나이" />
</property>
<속성 이름="섹스" 유형="문자열">
<열 이름="섹스" 길이="2" />
</property>
<!-- 쿼리문 정의-->
<쿼리 이름="findStudentByName">
<![CDATA[이름 = :name인 학생의 이름]]>
</쿼리>
</class>
</hibernate-mapping>
공개 목록<학생> 쿼리(){
세션 세션 = HibernateSessionFactory.getSession();
쿼리 q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("이름", "장산");
List<학생> list = q.list();
반환 목록;
}
방법 3 : 기본 SQL 쿼리 <sql-query>를 사용합니다. 이 방법에서는 테이블의 모든 열을 작성해야 합니다. 그렇지 않으면 return-scalar를 사용하여 필드 유형을 설정하지 않으면 '잘못된 열 이름' 오류가 발생합니다.
다음과 같이 코드 코드를 복사합니다 .
<최대 절전 모드 매핑>
<class name="com.test.bean.Student" table="student" 카탈로그="사용자">
<id name="id" type="integer">
<열 이름="ID" />
<생성기 />
</id>
<속성 이름="이름" 유형="문자열">
<열 이름="이름" 길이="11" />
</property>
<속성 이름="나이" 유형="정수">
<열 이름="나이" />
</property>
<속성 이름="섹스" 유형="문자열">
<열 이름="섹스" 길이="2" />
</property>
</class>
<!-- 쿼리문 정의-->
<sql-query name="findStudentByName">
<반환 별칭="s">
</return>
<![CDATA[s.name = :name인 학생에서 {s.*} 선택]]>
</sql-쿼리>
</hibernate-mapping>
참고 : <return/> 태그 내부에 <return-property/> 태그를 사용하여 테이블의 모든 필드를 나열할 수도 있습니다. 위에서 설명한 방법과 동일하게 모든 열이 쿼리됩니다.
다음과 같이 코드 코드를 복사합니다 .
공개 목록<학생> 쿼리(){
세션 세션 = HibernateSessionFactory.getSession();
쿼리 q = session.getNamedQuery("findStudentByName");
q.setString("이름", "장산");
List<학생> list = q.list();
반환 목록;
}
방법 4 : 기본 SQL 쿼리 <sql-query>를 사용합니다. return-scalar를 사용하여 필드 유형을 설정하는 경우 일부 필드를 쿼리할 수 있습니다.
다음과 같이 코드 코드를 복사합니다 .
<최대 절전 모드 매핑>
<class name="com.test.bean.Student" table="student" 카탈로그="사용자">
<id name="id" type="integer">
<열 이름="ID" />
<생성기 />
</id>
<속성 이름="이름" 유형="문자열">
<열 이름="이름" 길이="11" />
</property>
<속성 이름="나이" 유형="정수">
<열 이름="나이" />
</property>
<속성 이름="섹스" 유형="문자열">
<열 이름="섹스" 길이="2" />
</property>
</class>
<!-- 쿼리문 정의-->
<sql-query name="findStudentByName">
<return-scalar 열="이름" 유형="문자열"/>
<return-scalar 열="나이" 유형="정수"/>
<![CDATA[s.name = :name인 학생의 s.name, s.age 선택]]>
</sql-쿼리>
</hibernate-mapping>
공개 목록<객체[]> 쿼리(){
세션 세션 = HibernateSessionFactory.getSession();
쿼리 쿼리 = session.getNamedQuery("findStudentByName");
query.setString("이름", "장산");
List<Object[]> list = query.list();
반환 목록;
}
또는 :
다음과 같이 코드 코드를 복사합니다 .
공개 목록<학생> 쿼리(){
세션 세션 = HibernateSessionFactory.getSession();
q = session.getNamedQuery("findStudentByName") 쿼리.
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("이름", "장산");
List<학생> list = q.list();
반환 목록;
}