繁体   English   中英

查询对象模式(设计模式)

[英]Query Object Pattern (Design Pattern)

我需要在Java中为我的可自定义搜索界面(我正在编写的webapp)实现一个查询对象模式。

有谁知道我在哪里可以获得查询对象模式(Martin Fowler的QoP)的示例/教程?

提前致谢

加成如何查询模式添加到现有的DAO模式?

“查询对象模式”中的“模式”一词是(IMHO)放错位置的。 这不是一个真正的设计模式。 “查询对象”只是解释器模式的另一个例子。 传统的Hibernate Criteria API和现代JPA2 Criteria API是一个很好的例子,它将它与Builder Pattern结合在一起。

至于你的问题:

如何将查询模式添加到现有DAO模式?

我建议看看JPA2

查询对象

表示数据库查询的对象。

有关完整说明,请参见此处

SQL可以是一种涉及的语言,许多开发人员并不是特别熟悉它。 此外,您需要知道数据库模式形成查询的样子。 您可以通过创建隐藏参数化方法中的SQL的专用查找器方法来避免这种情况,但这使得难以形成更多的即席查询。 如果数据库架构发生更改,它还会导致SQL语句重复。

查询对象是一个解释器[Gang of Four],即可以将自身形成为SQL查询的对象结构。 您可以通过引用类和字段而不是表和列来创建此查询。 通过这种方式,编写查询的人可以独立于数据库模式执行此操作,并且可以将对模式的更改本地化在一个位置。

我在这里为NHibernate编写了一个C#实现: 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);
}

给定像这样的POCO实体类:

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

您可以像这样构建查询对象:

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

然后像这样使用它们:

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

如果你喜欢,你可以将它移植到Java。

以下是其他一些例子:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM