【问题标题】:Query Object Pattern (Design Pattern)查询对象模式(设计模式)
【发布时间】:2015-08-14 16:34:51
【问题描述】:

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

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

提前致谢

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

【问题讨论】:

  • 请注意,Hibernate 有一个不错的 Criteria API(JPA 2.0 现在也有一个类型安全的标准 API)。
  • 我正在收集的是我应该移动到休眠状态。

标签: java design-patterns


【解决方案1】:

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

关于你的问题:

如何将查询模式添加到现有的 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

    【讨论】:

    • 不应该是评论吗?
    • 我不这么认为。它通过提供示例代码直接回答了这个问题。
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-11-20
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多