gpt4 book ai didi

java - JPA Criteria API 检查关联集合是否是另一个集合的子集

转载 作者:行者123 更新时间:2023-11-30 21:22:27 25 4
gpt4 key购买 nike

我有 2 个表:joblanguage。这两个表之间的关系是m:n,这意味着一个工作可能需要多种语言,而一种语言可以被许多工作所需要。所以我必须创建一个名为 job_language 的第三个表来表示这种关系,它只包含两列 job_id(这是一个整数)和 language_code (例如英语的 'eng' 或日语的 'jap' 等)。我使用的数据库是 MySQL。

现在我必须使用 Spring Data JPA 创建一个 REST 服务,以获取所有需要一组语言的作业,这些语言是来自用户输入的另一组语言的子集。例如,假设我有 3 个作业,表 job_language 中的值如下所示:

--------------------------
| job_id | language_code |
--------------------------
| 1 | 'eng' |
--------------------------
| 2 | 'eng' |
--------------------------
| 2 | 'vie' |
--------------------------
| 3 | 'jap' |
--------------------------
| 3 | 'eng' |
--------------------------
| 3 | 'vie' |
--------------------------

现在用户想要找到需要 ('eng', 'vie') 的工作(这是根据用户输入创建的 language_code 列表),查询应该返回两个作业:job_id = 1 的作业和 job_id = 2 的作业。

这些是我的实体类:

@Entity
public class Job {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@ManyToMany
@JoinTable(name = "job_language",
joinColumns = { @JoinColumn(name = "job_id", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "language_code", nullable = false) })
private List<Language> languages;

// getters and setters here...
}

@Entity
public class Language {
@Id
@Column(columnDefinition = "char", length = 3)
private String code;

@Column(length = 100)
private String name;

// getters and setters...
}

我有一个 MySQL 查询正是这样做的,但由于 JPQL 不允许左连接两个不相关的表,我找不到使用 JPA Criteria API 的解决方案。有什么建议么?

这是我的工作查询:

select jl1.job_id
from job_language jl1 left join job_language jl2 on jl1.job_id = jl2.job_id and jl1.language_code = jl2.language_code and jl2.language_code in ('eng', 'vie')
group by jl1.job_id
having count(jl1.language_code) = count(jl2.language_code);

最佳答案

您可以将查询用作带有 Spring Data 存储库的 native SQL 查询。例如:

public interface JobRepository extends JobRepository<Job, Long> {
@Query(nativeQuery = true
, value = "SELECT "
+ " * "
+ "FROM"
+ " job "
+ "WHERE "
+ " id IN "
+ " ( "
+ " SELECT "
+ " jl1.job_id "
+ " FROM "
+ " job_language jl1 "
+ " LEFT JOIN "
+ " job_language jl2 "
+ " ON "
+ " jl1.job_id = jl2.job_id "
+ " AND jl1.language_code = jl2.language_code "
+ " AND jl2.language_code IN ?1 "
+ " GROUP BY "
+ " jl1.job_id "
+ " HAVING "
+ " COUNT(jl1.language_code) = COUNT(jl2.language_code) "
+ " )")
List<Job> findAllByLanguageCodes(String... languageCodes);
}

使用 native 查询的唯一标准是 Spring Data 应该能够将 native 查询的返回值转换为注释方法的返回类型。我们通过在查询的顶部放置一个 SELECT * FROM job 来利用这一点,这允许 Spring Data JPA 很好地处理结果,因为 job 被映射到一个 JPA实体(即使真正驱动查询的 job_location 不是)。

查看工作示例 here .

关于java - JPA Criteria API 检查关联集合是否是另一个集合的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31249643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com