我有一个简单的实体,其中的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属性。

最佳答案

我了解您要在此属性上使用FetchType.LAZY。

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

解决方案是创建一个包装器类,该类与包含您的Formula属性的类具有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();

关于java - 在一种情况下忽略@Formula,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49784729/

10-09 00:32