Spring存储库查询有两个表

时间:2017-10-07 11:11:12

标签: java sql database spring

我有一个包含两个表的数据库:

1)NumberEntity

|------|-------|--------|
|  id  |numero | volume |
|------|-------|--------|
|  1   |    1  |   1    |
|------|-------|--------|
|  2   |    1  |   2    |
|------|-------|--------|
|  3   |    2  |   1    |
|------|-------|--------|

2)ArticleEntity

|------|-------|------------|
|  id  |Article| numbers_id |
|------|-------|------------|
|  5   |    7  |   1        |
|------|-------|------------|
|  6   |    5  |   2        |
|------|-------|------------|
|  7   |    6  |   3        |
|------|-------|------------|

其中numbers_id是与第一个表的关系。 我想通过第一个查询提取 表,文章desc命令的文章。 我不知道如何做到这一点,我从这个问题开始:

public List<NumberEntity> findByVolumeAndNumero(String volume, String number);

我得到了文章列表,但第一篇是文章编号7,而不是像第一篇文章那样提取数字5,6和7。

这些是我的模特:

    @Entity
    public class NumberEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String volume;
    private String numero;
    @OneToMany(mappedBy="numbers", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ArticleEntity> articles = new ArrayList<ArticleEntity>();

另一个:

 @Entity
    public class ArticleEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String article;
    @ManyToOne
    private NumberEntity numbers;

所以我需要像这样的查询(即使它不正确,但它只是伪代码):

public List<NumberEntity> findByVolumeAndNumeroOrderByArticleDesc(String volume, String number);

问题是,我没有理解如何使用Spring将单个查询加入另一个表

4 个答案:

答案 0 :(得分:1)

您可以使用查询来执行此操作。请尝试使用此代码。

 @Query("SELECT * FROM number n join article a on n.id = a.numbers_id order by a.id  ")

答案 1 :(得分:0)

entityManager.createQuery("SELECT ae FROM ArticleEntity ae WHERE ae.numbers.volume = :volume AND ae.numbers.numero = :numero ORDER BY ae.article DESC).setParameter("volume", volume).setParameter("numero", numero)

如果您正在使用会话,您可以将entityManager与它交换。

答案 2 :(得分:0)

首先尝试不创建双向关系,因为当你进行选择时,你将面临一个循环;在你的情况下,从文章到数字创建一个关系ManyToOne就足够了。 查询应如下所示:

@Query("select * from ArticleEntity article inner join article.numbers number where article.numbers.volume=:volume and article.numbers.id=:id")
    List<ArticleEntity> findAll(@Param("volume") String volume , @Param("id") long id);

尝试此查询(p.s.检查字段名称与它们在java类(实体)中的相同)

您可以通过article.number.volume添加到查询订单desc之后或者您想要的内容...

另请阅读Criteria。这种编写查询的方式要简单得多,因为有一些方法可以实现很多SQL查询。

答案 3 :(得分:0)

@Query("SELECT a FROM ArticleEntity a, NumberEntity n WHERE ...")