我想知道是否可以使用JPA anotations配置动态@where子句。假设我有两个类之间的关系 - 公司(父)和invoces(孩子)。
如果有这样的注释声明(伪代码)。
@ManyToOne
@JoinColumn(name = "ID_MEN_PRE", referencedColumnName = "ID_MEN"
@Where(clause="invoice_month=:month")
private Testinvoices invoice;
我现在要做的是在where子句中传递“month”值。结果应该只返回给定日期的Testinvoices。
有办法怎么做?
答案 0 :(得分:2)
不,但过滤器 - 请参见下文 - 可以参数化。
然而,在我看来,当你真正想要查询是一个更好的解决方案时,你正试图建模关系。
或者,在数据库级别创建按日期过滤的视图,并将发票映射到该视图而不是表格。
17.1。休眠过滤器
Hibernate3能够预先定义过滤条件并附加 那些类级别和集合级别的过滤器。一个过滤器 criteria允许您定义类似于的限制子句 现有的“where”属性可用于类和各种 集合元素。 然而,这些过滤条件可以是 参数化。然后,应用程序可以在运行时决定是否 应启用某些过滤器以及它们的参数值 应该。过滤器可以像数据库视图一样使用,但它们是 在应用程序内参数化。
答案 1 :(得分:1)
This is not possible in JPA.
For same effect you can use criteria. Please refer to example below
Criteria criteria = session.createCriteria(Employees.class);
if (subsidiaryId != null) {
criteria.add(Restrictions.eq("subsidiaryId", subsidiaryId));
}
if (employeeId != null) {
criteria.add(Restrictions.eq("employeeId", employeeId));
}
if (lastName != null) {
criteria.add(
Restrictions.eq("lastName", lastName).ignoreCase()
);
}
答案 2 :(得分:0)
在运行时期间无法传递参数,但可以像这样使用它
@ManyToOne
@JoinColumn(name = "ID_MEN_PRE", referencedColumnName = "ID_MEN"
@Where(clause="invoice_month=january")
private Testinvoices invoice;