我有两个类 User 和 UserAssociation 用户具有 UserAssociation 的 OnetoMany 映射 我正在使用 Jpa Criteria To Fecth User,但是当我尝试延迟获取 UserAssociation 时,它会跳过 Filter
@Getter
@Setter
@ToString
@MappedSuperclass
@AllArgsConstructor
@SuppressWarnings("serial")
@EqualsAndHashCode(of = { "id" })
@NoArgsConstructor
@SuperBuilder
public abstract class AbstractJpaEntity implements Serializable {
@Id
protected Long id;
@CreatedDate
@Column(name = "created_at")
@Temporal(TemporalType.TIMESTAMP)
@IgnoreFromAuditLog
protected Date createdAt;
@LastModifiedDate
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
@IgnoreFromAuditLog
protected Date updatedAt;
@CreatedBy
@Column(name = "created_by", nullable = true)
@IgnoreFromAuditLog
protected String createdBy;
@LastModifiedBy
@Column(name = "updated_by", nullable = true)
@IgnoreFromAuditLog
protected String updatedBy;
@Column(name = "published", columnDefinition = "bit(1) default 1")
@IgnoreFromAuditLog
protected Boolean isPublished = true;
@Column(name = "deleted", columnDefinition = "bit(1) default 0")
@IgnoreFromAuditLog
protected Boolean isDeleted = false;
}
@Getter
@Setter
@ToString(callSuper = true)
@MappedSuperclass
@SuppressWarnings("serial")
@FilterDef(name = CommonConstants.TENANT_FILTER, parameters = {@ParamDef(name="tenant", type = "long")})
@Filter(name = CommonConstants.TENANT_FILTER, condition = "TENANT = :tenant")
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public abstract class AbstractTenantJpaEntity extends AbstractJpaEntity {
@Column(name = "TENANT")
protected Long tenant;
}
@Entity
@Getter
@Setter
@FilterDef(name = CommonConstants.TENANT_FILTER, parameters = {@ParamDef(name="tenant", type = "long")})
@Table(name = "user",uniqueConstraints = {@UniqueConstraint(columnNames = { "email" })})
@NoArgsConstructor
@SuperBuilder
@EqualsAndHashCode(callSuper = true,onlyExplicitlyIncluded = true)
public class User extends AbstractJpaEntity {
@Getter
@Column(name="email")
private String email;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="user_id")
@Filter(name = CommonConstants.TENANT_FILTER, condition = " tenant in (:tenant)")
private List<UserAssociation> mappings;
}
@Entity
@Getter
@Setter
@Table(name = "user_resource_mapping")
@NoArgsConstructor
@SuperBuilder
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
public class UserAssociation extends AbstractTenantJpaEntity {
@Column(name = "ROLE")
private String roleName;
@ManyToOne
@JoinColumn(name="user_id")
User user;
}
获取用户实体后当我执行 user.getUserAssociation
它应该只给我那些属于特定租户的记录
尝试在代码中添加过滤器,但它不起作用
Session session = (Session)entityManager.getDelegate();
Filter filter = session.enableFilter(CommonConstants.TENANT_FILTER);
filter.setParameter("tenant",requestDto.getTenant());
--fetch user then user.getUserAssociation--
session.disableFilter(CommonConstants.TENANT_FILTER);
假设用户在 UserResource 中有 3 个条目:
id=1, tenant=2, role="USER", user_id=1
id=2, tenant=4, role="销售", user_id=1
id=3, tenant=3, role="ADMIN", user_id=1
当我得到 user.getUserAssociation 时,我的期望是它应该返回第三行,因为我将租户参数设置为 3,但它给了我所有三个