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

13

我需要在Java中实现一个查询对象模式,用于我的可定制搜索界面(我正在编写的Web应用程序)。

有人知道哪里可以获取Query Object Pattern(Martin Fowler的QoP)的示例/教程吗?

谢谢您提前帮忙。

补充 如何将查询模式添加到现有的DAO模式中?


请注意,Hibernate拥有良好的Criteria API(JPA 2.0现在也有类型安全的criteria API)。 - Pascal Thivent
我所了解的是我应该转移到Hibernate。 - Buhake Sindi
类似问题 - https://dev59.com/iEvSa4cB1Zd3GeqPivuH - JamesG
2个回答

14
在“Query Object Pattern”中,“pattern”一词(在我看来)被放错了位置。它不是一个真正的设计模式。“Query Object”只是另一个解释器模式的例子。传统的Hibernate Criteria API和现代的JPA2 Criteria API是一个很好的例子,将其与构建者模式相结合。
关于你的问题:

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

我建议您查看JPA2

2
我在这里编写了一个 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

这应该是一条注释,不是吗? - Buhake Sindi
我不这么认为。它通过提供示例代码直接回答了问题。 - Shayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接