获取过滤嵌套实体

问题描述 投票:0回答:0

我有两个类 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,但它给了我所有三个

java spring hibernate jpa criteria
© www.soinside.com 2019 - 2024. All rights reserved.