我的公司拥有高度可配置的数据库搜索服务,对于以编程方式配置查询非常有用.Criteria API功能强大,但当我们的某个开发人员重构其中一个数据对象时,标准限制并不表示它们在我们运行单元测试之前就已被破坏,或者更糟糕的是,它们是在我们的生产环境中运行的.最近,由于这个问题,我们的重构项目在工作时间上意外地翻了一倍,项目规划存在差距,如果我们知道实际需要多长时间,我们可能会采取另一种方法.
我想使用Example API来解决这个问题.如果我们在实际POJO属性上指定"where"条件,Java编译器可以大声地指示我们的查询是不可靠的.但是,Example API中只有这么多功能,并且它在很多方面都有限制.以下面的例子为例
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
Run Code Online (Sandbox Code Playgroud)
在这里,正在查询属性"name"(其中名称如'P%'),如果我要删除或重命名字段"name",我们会立即知道.但物业"价格"怎么样?它被排除,因为Product对象有一些默认值,所以我们将"price"属性名称传递给排除过滤器.现在,如果"价格"被删除,这个查询将在语法上无效,直到运行时才会知道.瘸.
另一个问题 - 如果我们添加第二个where子句会怎么样:
product.setPromo("Discounts up to 10%");
Run Code Online (Sandbox Code Playgroud)
由于对enableLike()的调用,此示例将匹配促销文本"折扣高达10%",还有"折扣高达10,000,000美元"或其他任何匹配的内容.通常,Example对象的查询范围的修改(例如enableLike()或ignoreCase()并不总是适用于要检查的每个属性.
这是第三个也是主要的问题 - 其他特殊标准呢?使用标准示例框架无法使每个产品的价格超过10美元.没有办法通过促销,降序来订购结果.如果Product对象在某个Manufacturer上加入,则无法在相关的Manufacturer对象上添加标准.没有办法在制造商的标准上安全地指定FetchMode(尽管这通常是Criteria API的问题 - 无效的获取关系无声地失败,甚至更多的是定时炸弹)
对于上述所有示例,您需要返回Criteria API并使用属性的字符串表示来进行查询 - 再次消除了Example查询的最大好处.
Example API有哪些替代方案可以获得我们需要的那种编译时建议?
以下所有示例:包括for eager loading用于类级别查询.我在我的模型实例上尝试了它,它仍然发出了一堆查询 - 它是否适用于实例方法?
#in controller
@emails = person.sent_emails(:include => [:recipient])
#in view
render @emails
# _email.html.erb partial
<h1><%= email.recipient.name %></h1>
<p>
<%= email.content %>
</p>
#still issues a select * for emails, N+1 for recipients :/
Run Code Online (Sandbox Code Playgroud) 我真的很想确保我们的代码库没有错误,这些错误会被PHP的内置错误检查所警告,但我想确切地看到E_STRICT强制执行的操作.通过扩展,什么是PHP的"严格标准"?我看了,但找不到一份全面的清单.
我从经验中得知的一些严格的标准:
我所知道的关于E_STRICT的是它警告可能会破坏兼容性的代码,但我不确定具体是什么意思.
有没有关于此信息的好资源?
Hibernate映射问题,其中行为是模糊的和/或危险的.我有一对多关系,具有级联删除孤立条件和where条件限制集合中的项目.这里映射 -
<hibernate-mapping>
<class name="User" table="user" >
<!-- properties and id ... -->
<set table="email" inverse="true" cascade="all,delete-orphan" where="deleted!=true">
<key column="user_id">
<one-to-many class="Email"/>
</set>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个与一个或多个Email对象关联的User对象,其中至少有一个对于deleted属性具有'true'值.当我在User对象上调用session.delete()时,会发生以下哪两个?
一方面,方案1)忽略where条件,根据域模型可能不正确.但是在方案2)中,如果父项被删除,并且子(email)表的连接键上存在外键约束,则delete命令将失败.哪个发生了,为什么?这只是Hibernate功能如何模糊的另一个例子吗?
根据PHP文档:
overload()函数将为class_name标识的类启用属性和方法调用重载.
http://www.php.net/manual/en/function.overload.php
但那究竟是什么意思呢?这是否意味着我可以在该类上进行适当的重载(比如Java的重载)?
我正在编写一个简单的库来协助常见的断言。
type Test interface {
Fatalf(string, ...interface{})
}
func IsTrue(statement bool, message string, test Test) {
if !statement {
test.Fatalf(message)
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到该log包实际上有一个兼容的实现,如果可以相应地调用Fatalf(string, ...interface{})该方法那就太好了:IsTrue
IsTrue(false, "false wasn't true", log)
Run Code Online (Sandbox Code Playgroud)
但我得到了错误use of package log not in selector。有没有什么方法可以使用或包装一个包来使该模式发挥作用,或者这是不可能的?
我有一个结构可能没有设置time.Time值在其中一个字段上.在测试nullity时,我不能使用nil或0. time.Unix(0,0)也不一样.我想出了这个:
var emptyTime time.Time
if thing.time == emptyTime {
...
}
Run Code Online (Sandbox Code Playgroud)
但我想要一个解决方案,为我节省一个行/临时变量
go ×2
hibernate ×2
java ×2
php ×2
activerecord ×1
data-mapping ×1
duck-typing ×1
methods ×1
orm ×1
time ×1
upgrade ×1