给定以下实体:
@FilterDef(name = "TENANT_FILTER", parameters = {
@ParamDef(name = "tenantId", type = "long")
})
@Filter(name = "TENANT_FILTER", condition = "tenant_id = :tenantId")
public class Pariticipant {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "tenant_id")
private Long tenantId;
@Column(name = "firstname")
private String firstName;
@Column(name = "lastname")
private String lastName;
}
我激活过滤器并使用弹簧数据存储库查询实体:
Filter filter = entityManager.unwrap(Session.class).enableFilter("TENANT_FILTER");
filter.setParameter(fieldName, 1L);
// query using SpringData Repository
Pariticipant p = repository.getById(10L);
Hibernate生成以下查询:
SELECT participant0_.id AS id2_97_,
participant0_.tenant_id AS tenant_i3_97_,
participant0_.firstname AS firstname_97_,
participant0_.lastname AS lastname_97_
FROM participant participant0_
WHERE participant0_.tenant_id = 1
AND participant0_.id=?
作为 id
是主要键,如果where子句的顺序是相反的,例如。将过滤器附加而不是预先添加到WHERE子句中。例如:
SELECT participant0_.id AS id2_97_,
participant0_.tenant_id AS tenant_i3_97_,
participant0_.firstname AS firstname_97_,
participant0_.lastname AS lastname_97_
FROM participant participant0_
WHERE participant0_.id=?
AND participant0_.tenant_id = 1
这是一个非常简单的例子,但是问题越复杂,问题越糟。在我们的情况下,如果将过滤器附加而不是预先处理,则每个查询都会受益。
是否有任何方法可以影响滤波器中添加过滤器的位置?
无法做到这一点。以及条件顺序对执行速度具有可测量影响的假设对许多人(大多数吗?(严重的现代数据库是错误的。