Hibernate 获取链接到当前用户的对象
Hibernate fetching object linked to current user
我目前有点卡,没看清楚
所以我希望你们中的一个有好主意来帮助我。
目前重要的代码:
@Entity
@Table(name = "T_NOTA_RECIPIENT")
public class NotaRecipient extends PersistentEntity {
@Id
@Column(name = "NOTA_RECIPIENT_SID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "STATUS", insertable = true, updatable = true)
@Enumerated(EnumType.STRING)
private Status status = Status.NEW;
@ManyToOne
@JoinColumn(name = "NOTA_SID", referencedColumnName = "NOTA_SID", nullable = false)
private Nota nota;
@ManyToOne
@JoinColumn(name = "CREATOR_OFFICE_SID", referencedColumnName = "OFFICE_SID", nullable = false)
private Office creator;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "notaRecipient")
private Set<FollowUp> followUps;
...
}
现在,实际上我不想加载数据库中的所有 FollowUp
,而只是加载当前用户之一。
但问题是我想包含 FollowUp 以便我可以进行数据库分页查询。
我们使用休眠、Spring 数据和查询 DSL 与 BooleanBuilder 来 "refine" 我们的搜索。
我正在考虑使用 @Formula
,但这需要是一个常量字符串,所以我不能在其中包含当前用户 ID。
第二种解决方案可以将 FollowUp 设置为 @Transient
并自己在数据库中获取它并在我的服务中设置它。
这里的问题是我不能将它用作过滤器或按它排序。
@Formula
没有那么多文档,所以可以创建一个 @Transient
用户并在 @Formula
中使用它吗?
我问了一些同事,但他们帮不了我。
那么是时候在这里提问了。
我可以在 API 中获取当前用户,所以没问题。
有人有其他解决方案吗?
您可以使用表达式定义映射
@JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT f.id
FROM follow_up_table f
WHERE f.nota_id=id
and f.user_id={USER_ID})",
referencedColumnName="...")
然后添加休眠拦截器(参见 the example)并更改 SQL 动态替换
中的实际值 {USER_ID}
/**
* Called when sql string is being prepared.
* @param sql sql to be prepared
* @return original or modified sql
*/
public String onPrepareStatement(String sql);
我目前有点卡,没看清楚
所以我希望你们中的一个有好主意来帮助我。
目前重要的代码:
@Entity
@Table(name = "T_NOTA_RECIPIENT")
public class NotaRecipient extends PersistentEntity {
@Id
@Column(name = "NOTA_RECIPIENT_SID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "STATUS", insertable = true, updatable = true)
@Enumerated(EnumType.STRING)
private Status status = Status.NEW;
@ManyToOne
@JoinColumn(name = "NOTA_SID", referencedColumnName = "NOTA_SID", nullable = false)
private Nota nota;
@ManyToOne
@JoinColumn(name = "CREATOR_OFFICE_SID", referencedColumnName = "OFFICE_SID", nullable = false)
private Office creator;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "notaRecipient")
private Set<FollowUp> followUps;
...
}
现在,实际上我不想加载数据库中的所有 FollowUp
,而只是加载当前用户之一。
但问题是我想包含 FollowUp 以便我可以进行数据库分页查询。
我们使用休眠、Spring 数据和查询 DSL 与 BooleanBuilder 来 "refine" 我们的搜索。
我正在考虑使用 @Formula
,但这需要是一个常量字符串,所以我不能在其中包含当前用户 ID。
第二种解决方案可以将 FollowUp 设置为 @Transient
并自己在数据库中获取它并在我的服务中设置它。
这里的问题是我不能将它用作过滤器或按它排序。
@Formula
没有那么多文档,所以可以创建一个 @Transient
用户并在 @Formula
中使用它吗?
我问了一些同事,但他们帮不了我。
那么是时候在这里提问了。 我可以在 API 中获取当前用户,所以没问题。
有人有其他解决方案吗?
您可以使用表达式定义映射
@JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT f.id
FROM follow_up_table f
WHERE f.nota_id=id
and f.user_id={USER_ID})",
referencedColumnName="...")
然后添加休眠拦截器(参见 the example)并更改 SQL 动态替换
中的实际值 {USER_ID}/**
* Called when sql string is being prepared.
* @param sql sql to be prepared
* @return original or modified sql
*/
public String onPrepareStatement(String sql);