2010-04-15 5 views
6

새 동료가 Hibernate에서 XQLxRepository 클래스에 HQL을 삽입하는 대신 주석 (예 : @NamedQuery)을 사용하여 명명 된 HQL 쿼리를 사용하도록 제안했습니다.Hibernate는 HQL 질의 (annotations에서)라는 이름으로 최적화되어 있는가?

주석을 사용하면 쿼리를 집중화하는 것 외에 어떤 이점이 있는지 여부를 알고 싶습니다.

특히, Repository 메서드가 실행될 때가 아닌 클래스가로드 될 때 쿼리가 한 번만 구문 분석되기 때문에 성능이 향상됩니까? 프로 EJB 3 (마이크 키스)에서

+0

나는 둘 다 기준 쿼리를 선호합니다 ... – NimChimpsky

답변

8

:.

"... 우리는 가능한 지속성 공급자는 종종 JPQL을 미리 컴파일하는 조치를 취할 것입니다 때마다 명명 된 쿼리 추천은 배포 또는 초기화의 일부로 SQL로 쿼리의 이름 응용 프로그램의 단계. "

이 책은 JPA이지만, 일반적인 조언은 Hibernate에 적용됩니다. 그러나, Hibernate는 파싱 된 HQL/JPQL을 캐쉬하기 때문에 아마도 큰 성능 향상을 볼 수 없을 것이다. 명명 된 쿼리를 사용하는 또 다른 이점은 응용 프로그램을 다시 빌드 할 필요없이 배포시 매핑 파일을 사용하여 쿼리를 재정의하는 옵션을 제공한다는 것입니다. 프로덕션 환경에서 쿼리를 조정해야하는 경우 유용합니다.

5

성능상의 이점을 제외하고 SQL 삽입 공격으로부터 자신을 보호 할 수있는 주석이있는 HQL 쿼리를 사용하면 또 다른 장점이 있다고 생각합니다.

웹 응용 프로그램의 경우 쿼리에 사용자 입력 데이터가 포함되어있는 경우 이것이 중요합니다. 나는 그것이 자신의 의도라고 생각하지 않는다, 나는 코멘트가 오해되지 않도록 좀 더 컨텍스트를 제공하고 싶어하지만, SQL 주입에 대한

http://en.wikipedia.org/wiki/SQL_injection

3

라스 '의견은 잠재적으로 잘못된 것입니다.

명명 된 쿼리는 사양에 따라 매개 변수화되며 명명 된 매개 변수를 사용하는 것은 SQL 주입을 방지하기위한 한 단계입니다. 그러나 SQL 주입을 완벽하게 보호하지는 못합니다 (자세한 내용은 그의 링크 참조). 이 주석의 문구는 명명 된 쿼리를 사용하는 것이 주입 공격을 막는 데 필요한 유일한 단계라고 제안합니다. 실제로 일반 쿼리는 매개 변수화 될 수 있으며 명명 된 쿼리와 동일한 인젝션 공격 차단 수준을 제공하며 쿼리를 매개 변수화하는 것은 주입 공격을 차단하는 데 필요한 여러 단계 중 하나 일뿐입니다.

webapps에 대한 Lars의 의견에 덧붙이 자면, 애플리케이션이 외부에서 접하는 지 여부와 상관없이 주입 공격으로부터 보호하기 위해 데이터를 스크럽하는 것이 중요합니다. 또는 입력 데이터가 사용자 또는 다른 데이터베이스 또는 심지어 같은 데이터베이스).

2

개인적으로 나는 hql 쿼리가 잘못된 경우 인스턴트 메시지를 제공하면서 서버 시작 중에 hql 쿼리가 구문 분석된다는 사실보다는 성능 향상이 덜 중요하다고 개인적으로 생각합니다.

대신에 테스트하기 전에 이러한 오류를 포착하는 것이 좋습니다.

마지막으로 테스트하는 동안 CaSiNg 때문에 실제로 작동하지 않는 코드에서 쿼리가 발생했습니다. 이것은 명명 된 쿼리를 사용할 때 서버가 시작될 때 즉시 나타납니다.

물론, 나는 HQL을 Java 코드와 섞어 놓는 것을 싫어한다.