规范模式与特定的Hibernate查询

时间:2010-01-06 19:21:09

标签: sql hibernate domain-driven-design specification-pattern

我的问题是何时使用规范模式,何时使用特定的SQL查询。

我理解特定模式需要使用具体规范收集整个集合和后期过滤器。但我不明白特定SQL查询前面的优势。

CarColorSpecification cc = new CarColorSpecification(RED);
CarAgeSpecification ca = new CarAgeSpecification(OLDER, 5);

ISpecification finalSpec = cc.And(ca);

List<Car> res;
List<Car> carColl = service.getCars();
foreach(Car c in carColl) {
  if(finalSpec.isSatisfiedBy(c)) {
    res.add(c);
  }
}

在SQL / Hibernate中也一样

FROM Car c WHERE c.color = RED AND c.age > 5

我认为这取决于要处理的数据量。

3 个答案:

答案 0 :(得分:1)

如果表格针对相关列及其大小进行了适当的索引,则SQL版本将快速运行,如果它们不同,它将在数据库服务器和应用服务器之间传输较小的数据量。但是,它可能会在CPU和CPU I / O使用方面对SQL框施加更高的负载,并且在许多环境中,DB服务器是最昂贵的扩展组件。

所以是的,这在很大程度上取决于数据的大小。

答案 1 :(得分:0)

我认为一个很好的折衷方案是根据hibernate结合规范模式来生成HQL查询。 (也许Linq for Java ^^?)

答案 2 :(得分:0)

存储库用于从域类中抽象出持久性实现。简而言之,SQL / HQL应该只存在于您的存储库中。

如果您要处理高数据量,请在存储库上创建新方法,然后从规范调用该方法。