2010-01-15 1 views
10

Muszę zaimplementować wzorzec obiektów zapytania w języku Java dla mojego dostosowywanego interfejsu wyszukiwania (aplikacji internetowej, którą piszę).Wzorzec obiektu kwerendy (wzorzec projektu)

Czy ktoś wie, gdzie mogę uzyskać przykład/samouczek Wzorca obiektów zapytania (QoP Martina Fowlera)?

Dzięki z gory

ADDITION Jak dodać wzór zapytań do istniejącego wzoru DAO?

+0

Zauważ, że Hibernate ma ładny Criteria API (JPA 2.0 posiada również kryteria typesafe API teraz). –

+0

To, co zbieram, polega na tym, że powinienem przejść do Hibernate. –

+0

Podobne pytanie - http://stackoverflow.com/questions/2265290/query-object-implementation-examples – JamesG

Odpowiedz

10

Słowo "wzór" w "Wzorze obiektu zapytań" to (IMHO) błędne położenie. To nie jest prawdziwy wzór projektu. "Obiekt zapytania" to kolejny przykład z Interpreter Pattern. Dziedzictwo Hibernate Criteria API i nowoczesny JPA2 Criteria API są doskonałym przykładem, który łączy go z Builder Pattern.

Co do Twojego pytania:

Jak dodać Wzorzec zapytań do istniejącego wzoru DAO?

Polecam, aby rzucić okiem na JPA2.

3

Object Query

Obiekt, który reprezentuje zapytania do bazy danych.

Pełny opis patrz here

SQL mogą być zaangażowane język, a wielu deweloperów nie są szczególnie znane z nim. Ponadto musisz wiedzieć, jak wygląda schemat bazy danych w celu utworzenia zapytań. Można tego uniknąć, tworząc specjalistyczne metody wyszukiwania, które ukrywają SQL wewnątrz sparametryzowanych metod, ale to utrudnia tworzenie większej ilości zapytań ad-hoc. Prowadzi to również do powielania instrukcji SQL w przypadku zmiany schematu bazy danych.

Obiekt zapytania to interpreter [Gang of Four], czyli struktura obiektów, które mogą utworzyć się w zapytaniu SQL. Możesz utworzyć to zapytanie, odwołując się do klas i pól, a nie tabel i kolumn. W ten sposób ci, którzy piszą zapytania, mogą to zrobić niezależnie od schematu bazy danych, a zmiany w schemacie mogą być zlokalizowane w jednym miejscu.

+1

Źle zrozumiałeś moje pytanie. Wiem o strukturze obiektu zapytań i wiem, że zostało to opisane w książce Martina Fowlera. Chciałem zobaczyć wzorzec projektowy używany dla obiektu zapytania. –

2

Napisałem implementację C# dla NHibernate tutaj: https://github.com/shaynevanasperen/NHibernate.Sessions.Operations.

Działa za pomocą interfejsu takiego:

public interface IDatabases 
{ 
    ISessionManager SessionManager { get; } 

    T Query<T>(IDatabaseQuery<T> query); 
    T Query<T>(ICachedDatabaseQuery<T> query); 

    void Command(IDatabaseCommand command); 
    T Command<T>(IDatabaseCommand<T> command); 
} 

otrzymał POCO klasy jednostka tak:

class Database1Poco 
{ 
    public int Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

można zbudować zapytanie obiektów tak:

class Database1PocoByProperty1 : DatabaseQuery<Database1Poco> 
{ 
    public override Database1Poco Execute(ISessionManager sessionManager) 
    { 
     return sessionManager.Session.Query<Database1Poco>().SingleOrDefault(x => x.Property1 == Property1); 
    } 

    public int Property1 { get; set; } 
} 

A następnie użyj ich tak:

var database1Poco = _databases.Query(new Database1PocoByProperty1 { Property1 = 1 }); 

Jeśli chcesz, możesz przenieść to na Javę.

Oto kilka innych przykładów:

https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/ http://www.mrdustpan.com/command-query-objects-with-dapper#disqus_thread http://crosscuttingconcerns.com/CommandQuery-Object-pattern

+0

Czy nie powinien to być komentarz? –

+0

Nie sądzę. Bezpośrednio odpowiada na pytanie, podając przykładowy kod. – Shayne