我需要在Java中为我的可自定义搜索界面(我正在编写的webapp)实现一个查询对象模式。
有谁知道我在哪里可以获得查询对象模式的示例/教程(Martin Fowler的QoP)?
先谢谢
ADDITION 如何将查询模式添加到现有DAO模式?
答案 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