繁体   English   中英

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

[英]JPA/HIBERNATE: How to pass value in @where clause

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

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

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

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

有办法怎么做?

不,但过滤器 - 请参见下文 - 可以参数化。

但是,在我看来,当您实际查询是一个更好的解决方案时,您正试图建模关系。

或者,在数据库级别创建按日期过滤的视图,并将发票映射到该视图而不是表格。

17.1。 休眠过滤器

Hibernate3能够预先定义过滤条件,并在类级别和集合级别附加这些过滤器。 过滤条件允许您定义类似于类和现有“where”属性的限制子句以及各种集合元素。 但是,可以参数化这些过滤条件。 然后,应用程序可以在运行时决定是否应启用某些过滤器以及它们的参数值应该是什么。 过滤器可以像数据库视图一样使用,但它们在应用程序内部进行参数化。

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()
  );
}

在运行时期间无法传递参数,但可以像这样使用它

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM