Hibernate 获取链接到当前用户的对象

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

我目前对此有点受阻,看不清楚。

所以我希望你们中有一个有好主意来帮助我。

目前重要的代码:

@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,这样我就可以进行数据库分页查询。
我们使用 hibernate、Spring Data 和 Query DSL 以及 BooleanBuilder 来“细化”我们的搜索。

我正在考虑使用

@Formula
但这需要是一个常量字符串,所以我不能在其中包含当前的 userId。

第二个解决方案可以将 FollowUp 设置为

@Transient
并自己在数据库中获取它并将其设置在我的服务中。
这里的问题是我不能将它用作过滤器或按它排序。

@Formula
没有那么多文档,所以是否可以创建一个
@Transient
用户并在
@Formula
中使用它?

我问了一些同事,但他们无法帮助我。

那么现在就到这里提问的时间了。 我可以在 API 中获取当前用户,所以这没问题。

有人有替代解决方案吗?

java hibernate pagination spring-data
1个回答
2
投票

您可以使用表达式定义映射

@JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT f.id 
                                              FROM follow_up_table f 
                                              WHERE f.nota_id=id
                                              and f.user_id={USER_ID})", 
 referencedColumnName="...") 

然后添加 hibernate 拦截器(参见示例)并动态更改 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);
© www.soinside.com 2019 - 2024. All rights reserved.