Hibernate过滤条件:访问嵌套属性/使用别名

时间:2017-08-02 08:22:42

标签: java hibernate jpa

我有BaseEntity来定义@Id String id。我想在与@ManyToOne匹配的id关系上使用休眠过滤器。我还有一层层次结构,我不知道它是否有所作为,所以我会包含它以防万一。

@Entity
public class Market extends BaseEntity {}

@MappedSuperclass
@FilterDef(name = "market", parameters = @ParamDef(name = "marketId", type = "string"))
@Filter(name = "market", condition = "{alias}.market.id = :marketId")
public abstract class MarketSpecificEntity extends BaseEntity {
  @ManyToOne
  private Market market;
}

@Entity
public class Product extends MarketSpecificEntity {}

据我了解,{alias}应该替换为hibernate使用的别名。来自ProductRepository.findAll()的SQL:

select product0_.id as id1_1_, product0_.market_id as market_i2_1_ from product product0_ where {alias}.market.id = ?

省略别名适用于非嵌套属性但嵌套id上没有(按预期方式):

select product0_.id as id1_1_, product0_.market_id as market_i2_1_ from product product0_ where market.id = ?

我也尝试使用aliases的{​​{1}}参数建议in this answer,但我不明白如何改编它。

还有一点需要注意:比较不得导致@Filter。这是有效的,因为JOIN是保存在market.id表中的外键,对吧?

2 个答案:

答案 0 :(得分:0)

尝试使用受保护而非私有

public abstract class MarketSpecificEntity extends BaseEntity {
  @ManyToOne
  protected Market market;
}

答案 1 :(得分:0)

好吧,似乎condition的语法不是JPQL而是实际的SQL(为什么?!)。这确实有效:condition = "market_id = :marketId"

此外,它们是使用$FILTER_PLACEHOLDER$注入别名的方法,如here所示。