2011-01-19 10 views
6

jest prosty sposób na obsługę iniekcji SQL w klauzuli HQL Hibernate. Nazwane params oczywiście nie działa na to.Obsługa iniekcji SQL w porządku HQL według klauzuli

EDIT:

Zapraszam aby umieścić swój sposób postępowania z tego problemu. Chcę zobaczyć rozwiązania innych ludzi i uczyć od nich.

Dzięki za wszelkie sugestie i rozwiązania.

+0

Dlaczego nie używać nhibernate z linq? – Dave

+0

@Dave Hi, używam Java, więc linq nie jest dostępny dla mnie. –

+0

Powinienem był wybrać hibernację, a nie nHibernate! Powodzenia w rozwiązaniu tego problemu. – Dave

Odpowiedz

3

Można użyć interfejsu API Hibernate zamiast HQL.

Kryteria API sprawdzają, czy kryterium zamówienia odnosi się do poprawnej właściwości.

jeśli spróbujesz cos takiego:

public void testInjection() { 
    String orderBy = "this_.type desc, type"; 

    Criteria crit = this.getSession().createCriteria(DemoEntity.class); 
    crit.addOrder(Order.asc(orderBy));  
    crit.list(); 
} 

Dostaniesz QueryException: "could not resolve property this_ of de.test.DemoEntity" rzucony przez AbstractPropertyMapping.

+0

Cześć, dziękuję za odpowiedź, ale pracuję nad uruchomieniem projektu, w którym nie mogę przejść do API kryteriów. Tak więc szukam dokładnie tego, o czym mówisz, ale w HQL. –

0

Hibernate korzysta z aplikacji PreparedStatement, która już działa przeciwko iniekcjom SQL. W PreparedStatment argumenty są powiązane z instrukcją, a nie z wydaniem zwykłego polecenia SQL. Nie powinieneś martwić się o iniekcję SQL podczas korzystania z hibernacji.

Oto wątek, który zapewnia, że ​​hibernacja jest bezpieczna przed wstrzyknięciem SQL Click Here.

+0

Tak, to prawda, ale jeśli użyjesz setParameter w PreparedStatment SQL wygląda jak <... order by 'name' ...>, a wynik nie jest uporządkowany, ponieważ powinien wyglądać jak <... order by name ... .>. Szukam prostego sposobu na uniknięcie zarządzania tabelą dozwolonych pól. –

1

Skończyło się na rozwiązaniu, którego chciałem uniknąć. Zaimplementowałem mapę, w której klucz jest tym, co widzą użytkownicy w adresie URL, a wartość to kolumny w DB, które są po klauzuli ORDER BY.