2010-01-15 30 views
10

Özelleştirilebilir arama arayüzüm için Java'da bir Sorgu Nesnesi Kalıbı uygulamam gerekiyor (yazı yazdığım bir webapp).Sorgu Nesne Kalıbı (Tasarım Kalıbı)

Sorgu Nesne Kalıbının (Martin Fowler'in QoP) bir örneğini/öğreticisini nereden alabileceğimi bilen var mı?

ADDITION Nasıl varolan DAO desenine bir sorgu Desen eklemek için Advance

Teşekkür?

+0

Not. –

+0

Topladığım şey, o zaman Hazırda beklemem gerektiğidir. –

+0

Benzer soru - http://stackoverflow.com/questions/2265290/query-object-implementation-examples – JamesG

cevap

10

"Query Object Pattern" içindeki "pattern" kelimesi (IMHO) yanlış yazılmış. Bu gerçek bir tasarım deseni değil. "Sorgu Nesnesi", Interpreter Pattern'un sadece başka bir örneğidir. Eski Hibernate Criteria API ve modern JPA2 Criteria API, Builder Pattern ile birleştiren mükemmel bir örnektir. Sorunuza gelince

:

Nasıl varolan DAO desenine bir sorgu Desen eklenir?

JPA2'a göz atmanızı tavsiye ederim.

3

sorgu nesne

bir veritabanı sorgusu temsil eden bir nesne.

tam açıklaması için here

SQL bir yer dil olabilir görebilir ve pek çok geliştirici onunla özellikle aşina değildir. Ayrıca, veritabanı şemasının sorguları oluşturmak için neye benzediğini bilmeniz gerekir. SQL içerisindeki parametreleştirilmiş yöntemleri gizleyen özel bulucu yöntemleri oluşturarak bundan kaçınabilirsiniz, ancak bu da daha fazla anlık sorgular oluşturmayı zorlaştırır. Ayrıca, veritabanı şemasının değişmesi durumunda SQL ifadelerinde çoğaltmaya yol açar.

Bir Sorgu Nesnesi bir yorumlayıcıdır [Dörtün Çetesi], yani bir SQL sorgusunda kendisini oluşturabilen nesnelerin yapısıdır. Bu sorguyu, tablolar ve sütunlar yerine sınıflara ve alanlara başvurarak oluşturabilirsiniz. Bu şekilde sorguları yazanlar veritabanı şemasından bağımsız olarak yapabilirler ve şemadaki değişiklikler tek bir yerde lokalize olabilir.

+1

Sorumu yanlış anladınız. Query Object desenini biliyorum ve bunun Martin Fowler'in kitabında açıklandığını biliyorum. Sorgu Nesnesi için kullanılan tasarım desenini görmek istedim. –

2

NHibernate için bir C# uygulaması yazdım: https://github.com/shaynevanasperen/NHibernate.Sessions.Operations.

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); 
} 

Böyle bir POCO varlık sınıfı Verilen:

Böyle bir arabirim kullanarak çalışır

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

Sen sorgu inşa edebilirsiniz böyle nesneleri:

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; } 
} 

Ve sonra bunları şu şekilde kullanın:

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

İsterseniz bunu Java'ya yönlendirebilirsiniz.

Burada bazı örnekler şunlardır: Hazırda güzel Kriterler API (JPA 2.0 da artık türgüvenli kriterleri API vardır) sahip olduğunu

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

Bunun yerine bir yorum yapılmamalıdır? –

+0

Ben öyle düşünmüyorum. Örnek kodu sağlayarak doğrudan soruyu cevaplar. – Shayne