我有一个带字段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
属性。
答案 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();