2013-01-12 4 views
5

나는 데이터를 얻기 위해 Hibernate를 사용하는 Java 애플리케이션을 작성하고있다. 애플리케이션에서 사용자가 입력 한 sql 명령 문자열을 사용하는 입력 텍스트 영역을 가지고 있으며, 사용자가 쿼리 한 데이터를 얻기 위해 최대 절전 모드를 통해이를 실행한다. 결과 테이블이 어떻게 보일지 미리 알 수 없으므로 열 이름을 알지 못합니다. 그러나 열 이름이 데이터 필드와 관련된 테이블에 사용자 쿼리 결과를 표시해야합니까?이를 어떻게 최대 절전 모드에서 수행 할 수 있습니까? 나는 다음과 같은 코드를 시도했다 :최대 절전 모드 쿼리 결과에서 Java로 열 이름을 가져 오는 방법은 무엇입니까?

Session session=HibernateUtil.getSession(); 
    session.beginTransaction(); 
    Query q=session.createQuery(hql); 

    AliasToEntityMapResultTransformer INSTANCE=new AliasToEntityMapResultTransformer(); 
    q.setResultTransformer(INSTANCE); 
    List<Map<String,Object>> aliasToValueMapList=q.list(); 

    for (Map<String,Object> map : aliasToValueMapList) 
    for (Map.Entry<String,Object> entry : map.entrySet()) System.out.println(entry.getKey()+" - "+entry.getValue()); 

그것은 나에게 다음과 같은 오류 메시지가 준 : 스레드 "AWT-EventQueue의-0"java.lang.ClassCastException가의 예외 : sakila.entity.Actor는 자바로 캐스팅 할 수 없습니다. util.Map

첫 번째 for 루프를 가리키고 있습니다. 최대 절전 모드를 처음 사용하기 때문에, 위의 코드를 수정하는 방법을 알지 못합니까? 누군가 내 케이스에서 작동하는 몇 가지 샘플 코드를 보여줄 수 있습니까?

편집 : Marcel Stör이 아래에 언급했듯이 두 가지 상황이 발생하도록 허용해야하며 사용자가 모든 데이터를 쿼리 할 수있는 능력을 제한하지 않아야하며,이를 수행하는 가장 좋은 방법은 무엇입니까? 나는 아주 이해하지만 여전히 대답을 감히하지 않습니다

답변

1

...

Query q=session.createQuery(hql); 같은 HQL가 다시 객체 기본적으로이 아닌 개별 필드를 얻을 제안 사용하는 경우. 이것은 어쨌든 결과를 쿼리로 다시 매핑하려고하지만, 행의 이름으로 객체의 필드 이름을 사용하기 만하면됩니다.

텍스트 영역에서 가져온 내용이 일반 SQL 인 경우 session.createSQLQuery(sql)을 사용해야합니다. 당신이 돌아 오는 것은 list of object arrays입니다. 그러나 여기에서도 데이터 만 가져옵니다. 사용자가 select * 개의 검색어를 사용하지 못하게해야합니다. 그런 다음 쿼리의 필드/열 이름을 출력 열 이름으로 사용할 수 있습니다.

0

사용자가 SQL 또는 HQL 쿼리에 입력합니까? 그들 사이에는 큰 차이가 있습니다.

HQL 쿼리에서 사용자 유형, 당신은 hqlQuery.getReturnTypes()를 호출 할 수 있으며, 각 유형에 대해 당신이 테이블 메타 데이터를 찾아 whatever suggested in this post을 할 수 있다면

.

0

나는 내가 List<Map<String, Object>의 요소 맵을 반복 할 수있는 하나 개 이상의 레코드로보기 DTO로

를 사용

select new Map(id as id, name as name) from Person 

같은 HQL 질의에 대한 문제의 같은 종류를 가지고 . 비어있는 데이터 세트로 상황을 관리해야하는 경우에만 문제가 발생합니다. 그 경우 과 같은 것

public List<String> getAliases(String queryString) { 
    ArrayList<String> list = 
     new ArrayList<String>(Arrays.asList(queryString.split("as "))); 
    List<String> result = new ArrayList<String>(); 
    list.remove(0); 
    for (String str : list) { 
     StringTokenizer st = new StringTokenizer(str, ",) "); 
     result.add(st.nextToken()); 
    } 
    return result; 
}