【发布时间】:2015-07-10 16:04:24
【问题描述】:
我有 2 张桌子:job 和 language。这两个表之间的关系是 m:n,这意味着一个工作可能需要多种语言,而一种语言可能需要多种工作。所以我必须创建一个名为job_language 的第三个表来表示这种关系,它只包含两列job_id(它是一个整数)和language_code(例如'eng' 用于英语或'jap' 用于日语, ETC。)。我使用的数据库是 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);
【问题讨论】:
-
请看看这是否有帮助:stackoverflow.com/questions/18488351/…
-
@MatiasCaamaño 不,它不会有帮助,这个问题是关于检查一个字符串是否包含在另一个字符串中,但我的问题是检查一个关联集合是否是另一个集合的子集,也许我是我的问题不清楚,让我编辑它,请稍后再看。
标签: java mysql hibernate spring-data-jpa