2009-09-11 12 views
5

Mam to, na co jestem pewien, dość powszechny problem i nie chcę ponownie wymyślać koła. Mam formularz wyszukiwania, w którym użytkownicy mogą określić kryteria wyszukiwania i typ wyszukiwania (AND OR Ext ..).Dynamiczne tworzenie klauzuli WHERE od użytkownika Kryteria wyszukiwania

Formularz przekazuje identyfikator tej mapy do nazw i wartości kolumn. Obecnie używam Java po stronie serwera, aby skleić ciągi razem w klauzuli where. W niektórych przypadkach działa, ale jest niezgrabny, podatny na błędy i nie będzie skalowany.

Wszelkie sugestie?

Dzięki,

David

+2

Czy mógłbyś wyjaśnić, dlaczego uważasz, że jest to niestałe i podatne na błędy? Być może mógłbyś opublikować przykładowy kod ilustrujący to. –

Odpowiedz

0

Trzeba zbudować ciąg wyszukiwania albo na kliencie lub na serwerze. Zbudowanie go na kliencie nie jest oczywiście dobrym rozwiązaniem (bezpieczeństwo), więc jedyną opcją jest zbudowanie go na serwerze. Osobiście użyłbym lub zbudował obiekt Searcher, który obsługuje powtarzające się zadanie budowania ciągów wyszukiwania skutecznie i tworzy Stamtąd oświadczenie.

1

Jeśli korzystasz z ORM (korzystam z Hibernacji), możesz użyć interfejsu API Criteria: , który umożliwia agregację warunków (używając na przykład pętli) i tworzy wynikowe zapytanie.

w natywnym SQL, nie wiem, biblioteki, który by tego nie zrobił. Może mógłbyś napisać własną, czerpiąc inspirację z dokumentacji i kodu Kryteriów Hibernacji?


OR:

Jeśli coś zrobić wystarczająco złożony na kliencie (powiedzmy zarządzać priorytety między AND i OR można zagnieżdżać warunki korzystania nawiasu ...), to prawdopodobnie jesteś już budynku struktura danych, która obsługuje to na kliencie.

W takim przypadku sugeruję wysłanie tej struktury danych na serwer i użycie jej za pośrednictwem pętli do zbudowania zapytania.

0

Hibernate ma API kryteria, które pozwala na tworzenie dynamicznych zapytań z wykorzystaniem metody tylko inwokację, bez konieczności ręcznego składu zapytania SQL.

Ale należy rozważyć użycie rozwiązanie dla wyszukiwania pełnotekstowego jak Lucene lub hibernacji wyszukiwania, które znacznie zmniejszają potrzebę zapytania o skomplikowanym stanie. Wyszukiwanie pełnotekstowe jest również znacznie lepszym rozwiązaniem dla wygody użytkownika, ponieważ wyszukiwanie pełnotekstowe jest prostsze do wykonania i zwykle zapewnia lepsze wyniki.

1

Użyłbym przygotować i? dla parametrów w każdym razie, tylko w celu uniknięcia ryzyka wstrzyknięcia i innych nieporozumień.

Jeśli Twoje kryteria wyszukiwania są ograniczone pod względem wielkości, można statycznie listy wszystkich możliwych zapytań do przygotowania.

Jeśli nie można utrzymać pulę przygotowanych zapytań dynamicznie. Nie jest to tak przydatne w przypadku aplikacji internetowej, w której prawdopodobnie nie uda się ponownie wykorzystać żadnego z przygotowanych zapytań. sugestia

0

Massimiliano Fliri by spojrzeć na API Criteria got me zmierza we właściwym kierunku. Zatrzymałem się na temat budowania "tylko klauzuli, gdzie" i zacząłem myśleć o tym jako o potrzebie budowania oświadczeń.

to doprowadzić mnie do rozwiązania: squiggle-SQL: http://code.google.com/p/squiggle-sql/

Od docs:

Squiggle jest trochę biblioteki Java do dynamicznego generowania instrukcji SQL SELECT. To jest słodkie miejsce dla aplikacji, które muszą budować skomplikowane zapytania z kryteriami, które zmieniają się w czasie wykonywania. Zwykle może być dość bolesnym dowiedzieć się, jak zbudować ten ciąg. Squiggle zabiera dużo tego bólu.

+0

FYI: Na pierwszy rzut oka biblioteka ta nie obsługuje gotowych instrukcji i parametrów. Na przykład ciągi wydają się być osadzone bezpośrednio w SQL wygenerowanym przez bibliotekę. Może to prowadzić do ataków SQL injection attack. Mogę się mylić... –

0

Jeśli używasz Hibernate jako ORM, użyj w tym celu interfejsu API Criteria. Musi być łatwiej dodawać/usuwać klauzule na podstawie pewnych warunków.

Jeśli budujesz JDBC kwerendy zachować część, która jest stała pierwsza i dołącz zmieniające część dla np

select * from trans gdzie userid =?

i dołączyć na podstawie warunków, np.
, jeśli kwota! = Null następnie dołączyć "i kwota>? "

Dopóki można utrzymać stałą część dobrze oddzieloną od części zmiennej, nie powinno być problemu.

0

Książka "Expert SQL Server 2005 Development" autorstwa Adama Machanica zawiera doskonałe wskazówki w rozdziale 7 dotyczącym dynamicznego SQL. Nurkuje w różnego rodzaju sprawach, w tym wydajności, łatwości obsługi i bezpieczeństwa. Nie będę próbował przerobić jego rozdziału - wystarczy powiedzieć, że jego zdaniem mniej znaczy więcej, jeśli chodzi o SQL.

Jest to specyficzne dla SQL Server, ale uważam, że jego ogólne podejście (ogromne, gdy klauzula vs./jeśli/następnie SQL vs. dynamiczne) może być stosowane na całej tablicy.

EDYCJA: Myślę, że warto dodać ... nigdy nie ufaj wejściom od klienta, zawsze sparametryzuj wejście przed użyciem go w SQL.

Powiązane problemy