在一个案例中忽略@Formula

时间:2018-04-11 21:28:38

标签: java spring hibernate jpa

我有一个带字段countUsing的简单实体,它指定在其他表中使用的计数。它是带有注释Formula的子查询。

我希望在一种情况下忽略公式中的执行查询,但其他子查询必须调用。

我的实体:

@Entity
@Table(name = "roles")
public class Role {

    @Id
    @GeneratedValue(generator = "roles_id_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "roles_id_seq", sequenceName = "roles_id_seq", allocationSize = 1)
    @Column(name = "id")
    private Long id;

    @Column(name = "\"NAME\"")
    private String name;

    @Convert(converter = LocalDateTimeAttributeConverter.class)
    private LocalDateTime insertDate;

    @Convert(converter = LocalDateTimeAttributeConverter.class)
    private LocalDateTime updateDate;

    @Formula("(SELECT COUNT(*) FROM user_roles us WHERE us.id_role = id)")
    private Integer countUsing;
}

我如何实现目标,我想到了字段countUsing的任何注释中的标记。

注释Formula只有value属性。

1 个答案:

答案 0 :(得分:1)

我知道你想在这个属性上使用FetchType.LAZY。

因此,您不能直接在类中的@Formula属性中使用LAZY。

解决方案是创建一个包装器类,它与您的类包含一个包含公式属性的oneToOne关系,如下所示:

@Entity
@Table(name = "roles")
public class Role{
    ... /*other attributes*/

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "role")
    private RoleCounting roleCouting;
}

@Entity
@Table(name = "roles")
public class RoleCounting{
    @Id
    @Column(name="id", insertable = false, updatable = false)
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    @JoinColumn(name = "id", insertable = false, updatable = false)
    private Role role;

    @Formula("(SELECT COUNT(*) FROM user_roles us WHERE us.id_role = id)")
    private Integer countUsing;
}

这样,子查询只会在您调用时执行: role.getRoleCounting().getCountUsing();