JPA / HIBERNATE:如何在@where子句中传递值

时间:2013-10-15 09:17:51

标签: java hibernate jpa annotations persistence

我想知道是否可以使用JPA anotations配置动态@where子句。假设我有两个类之间的关系 - 公司(父)和invoces(孩子)。

如果有这样的注释声明(伪代码)。

@ManyToOne
@JoinColumn(name = "ID_MEN_PRE", referencedColumnName = "ID_MEN"
@Where(clause="invoice_month=:month")
private Testinvoices invoice;

我现在要做的是在where子句中传递“month”值。结果应该只返回给定日期的Testinvoices。

有办法怎么做?

3 个答案:

答案 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;