我有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
表中的外键,对吧?
答案 0 :(得分:0)
尝试使用受保护而非私有
public abstract class MarketSpecificEntity extends BaseEntity {
@ManyToOne
protected Market market;
}
答案 1 :(得分:0)
好吧,似乎condition
的语法不是JPQL而是实际的SQL(为什么?!)。这确实有效:condition = "market_id = :marketId"
。
此外,它们是使用$FILTER_PLACEHOLDER$
注入别名的方法,如here所示。