2009-10-08 5 views
3

동일한 쿼리에서 HQL과 SQl을 섞으려고합니다. 동일한 쿼리에서 HQL과 SQL을 섞음

를 사용하여 좋아요 ", ObjectA OBJ에서 TABLE_B TBL 곳 obj.someProp = tbl.COLUMN"

내 클라이언트가 쿼리를 수정해야하고, HQL 또는 매핑 매핑되지 않은 테이블을 학습 문제의 부족 때문에

:(

최대 절전 모드로하지 않으면

가, 누군가가 이것을 받아 들일 수있는 또 다른 ORM 도구를 알고 있습니까? 다른 JPA 구현, 또는 JDO?

나는.이 시도했습니다, 물론 작동하지 않습니다. 그것은에 의미가 있습니다 나 : 또한 결과가 객체에 매핑되지 않으므로 코딩을하지 않고 객체를 얻을 수있는 방법이 없습니다. 대부분 이유를 찾고 있습니다. 왜 이것이 곧 작동하지 않는지.

답변

10

이것은 실제로 작동하지 않으며 나는 그럴 것이라고 생각하지 않지만 "물건을 얻을 수있는 방법이 없기 때문에"라고 생각하지 않습니다.

최대 절전 모드 당신이 plain SQL queries을 사용할 수 있도록 수행하고 엔티티 (또는 엔티티가 아닌 자바 객체)에 결과를 매핑에 대해 서로 다른 선택의 여지를 제공한다. 당신은 당신의 쿼리를 작성할 수

SELECT table_A.* 
    FROM table_A JOIN table_B on table_A.some_prop_column = tableB.other_column 
WHERE ... 

과를 통해 최대 절전 모드에서 실행 : SQL을 혼합 HQL은 그들 사이의 충돌에 들어가 아주 쉽다이다와

List objectAs = session.createSQLQuery(yourQuerySQL).addEntity(ObjectA.class).list(); 

문제 - HQL에서 생성 된 SQL은 하나의 테이블 별칭 (raw SQL another)을 사용할 수 있습니다. SQL 테이블을 포함 할 수 있습니다 생성/... 등 원시 ​​SQL로

충돌 조인 그리고 그것은 결국 당신에게 절대적으로 아무것도를 얻을 수없는 모든이 - 심지어 사용 사례를 도움이되지 않습니다. 누군가가 "혼합 된"HQL/SQL 질의를 수정하기를 원한다면, 여전히 을 알고 있어야합니다. 적어도 두 가지를 구별하는 데 필요한 수준에서.

최종 사용자가 해당 쿼리를 사용자 정의 할 수 있어야하는 경우 아마도 사용자의 입력을 기반으로 필요한 쿼리를 생성하기 위해 Criteria API을 사용해야합니다. 극단 사전주의 사항을 취하지 않으면 최종 사용자가 응용 프로그램 내에서 실제 쿼리를 수정하는 것이 심각한 보안 구멍입니다.

+0

와우 - 위대한 작품입니다. SQL 및 자동 엔티티로드로 정말 멋지고 강력한 기능! 하나의 유형의 엔티티 검색을 위해 간단한 SQL 조인을하기 위해 모든 HQL 엔티티를 매핑해야하는 것이 두려웠습니다. Btw. JPA/Hibernate 4.3.7을 사용하여 다음과 같이 쉽게 처리 할 수 ​​있습니다 :'List < DAO > daos = em.createNativeQuery (sql, myDaoClass) .getResultList()' –

관련 문제