我处于我们公司具有高度可配置的数据库搜索服务的位置,对于此类服务,以编程方式配置查询非常有用。 Criteria API功能强大,但是当我们的开发人员重构其中一个数据对象时,条件限制不会表示它们在我们运行单元测试之前已经损坏,或者更糟糕的是,它们在我们的生产环境中正常运行。最近,由于这个问题,我们有一个重构项目出乎意料地在工作时间翻了一番,项目规划中存在一个缺口,如果我们知道需要多长时间,我们可能会采取另一种方法。如何克服Hibernate标准和示例API的局限性?
我想使用示例API来解决此问题。如果我们在真正的POJO属性中指定'where'条件,那么Java编译器可以大声表明我们的查询是borked的。但是,Example API中只有很多功能,并且在很多方面都受到限制。看看下面的例子
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
在这里,“名称”属性被查询反对(其中名称像“P%”),如果我是删除或重命名字段“名”,我们会立即知道。但是,财产“价格”呢?它被排除了,因为Product对象有一些默认值,所以我们将“price”属性名称传递给排除过滤器。现在,如果“价格”被删除,这个查询在语法上是无效的,并且直到运行时才会知道。瘸。
另一个问题 - 如果我们添加了什么第二where子句:
product.setPromo("Discounts up to 10%");
因为调用enableLike()的,这个例子将匹配的宣传文字“折扣高达10%”,但也“折扣高达1000万美元”或其他任何匹配。通常,Example对象的查询范围修改(如enableLike()或ignoreCase())并不总是适用于每个正在检查的属性。
这是第三个主要问题 - 其他特殊标准呢?使用标准示例框架无法获得价格高于10美元的每件产品。无法通过促销,降序来订购结果。如果产品对象加入某个制造商,则无法在相关的制造商对象上添加条件。没有办法在制造商的标准上安全地指定FetchMode(虽然这是一般的Criteria API的问题 - 无效提取的关系失败,甚至更多的定时炸弹)
对于所有上述示例,您需要返回Criteria API并使用属性的字符串表示形式进行查询 - 同样,消除了示例查询的最大好处。
示例API还有什么替代方法可以获得我们需要的编译时建议?
这是非常有趣的东西,但stackoverflow不是一个论坛,你不会在这里得到反馈,你的问题可能会被关闭在当前的形式。正如常见问题解答中所述,“只要您假装自己处于危险境地:提问并回答自己的问题也是完全正确的:以问题的形式表述它”*。我建议改写它,并将细节作为答案发布。 – 2010-09-10 17:53:08
@Pascal谢谢,我会继续并重新编制问题 – 2010-09-10 18:46:25
不客气。并感谢张贴这个。 – 2010-09-11 03:17:21