【问题标题】:How to get collection of property in Join JPA criteria API如何在加入 JPA 标准 API 中获取属性集合
【发布时间】:2021-08-03 11:43:40
【问题描述】:

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

我想出了一个低效的方法是选择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_ 。如您所见,选择中有一个. 会使查询中断(我相信全选)

@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;
}

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多