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

时间:2010-01-15 00:05:39

标签: java design-patterns

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

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

先谢谢

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

3 个答案:

答案 0 :(得分:12)

“查询对象模式”中的“模式”一词是(IMHO)放错地方。这不是一个真正的设计模式。 “查询对象”只是Interpreter Pattern的另一个例子。遗产Hibernate Criteria API和现代JPA2 Criteria API是一个很好的例子,它将它与Builder Pattern结合起来。

关于你的问题:

  

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

我建议您查看JPA2

答案 1 :(得分:4)

查询对象

表示数据库查询的对象。

有关完整说明,请参阅here

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

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

答案 2 :(得分:3)

我在这里为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