如何在加入 JPA 条件 API 中获取 属性 的集合

How to get collection of property in Join JPA criteria API

我正在尝试从 ListAttribute<Article, PolicyType> 获取 属性 policy_type_id 的列表,但我不知道该怎么做。

我想出一个低效的方法是 select 整个 PolicyType 的集合然后稍后过滤它

        Root<ArticleVersion> a = cq.from(ArticleVersion.class);
        Join<ArticleVersion, Article> join1 = a.join(ArticleVersion_.article, JoinType.INNER);
        cq.where(getCondition(cb, join1));
        cq.multiselect(join1.get(Article_.article_id), join1.get(Article_.policyTypes), a);

遗憾的是,hibernate 会生成这样的错误查询 select article1_.article_id as col_0_0_, . as col_1_0_, articlever0_.article_version_id as col_2_0_ 。如您所见,select 中有一个 . 使查询中断(我相信 select 全部)

@Entity
@Table(name = "PolicyType", schema = "SM_Request")
@Getter
@Setter
@NoArgsConstructor
public class PolicyType {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int policy_type_id;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "PolicyTypeArticle", schema = "SM_Request", 
    joinColumns = @JoinColumn(name = "policy_type_id"), inverseJoinColumns = @JoinColumn(name = "article_id"))
    @JsonIgnore
    private List<Article> articles;
}

经过长时间的搜索,我认为hibernate 不支持原始类型的查询元组和对象列表(这有点可悲,与LINQ 查询相比)。我决定将我的查询分解成更小的部分。首先,我 select article_idArticleVersion 的元组。在那之后,我 select 一个 PolicyType 的列表,其中还包含 article_id,并且 union 2 列表返回。

在我写这篇文章的时候,我有了一个想法,我可以 select 将所有 3 个连接在一起并按照我想要的方式转换数据。但这实际上取决于许多方面,例如您使用的连接数或连接类型,每个 table 中的数据增长速度(JOIN queries vs multiple queries