首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少INNER JOIN ON子句的JPA和Hibernate

缺少INNER JOIN ON子句的JPA和Hibernate
EN

Stack Overflow用户
提问于 2018-08-16 03:34:48
回答 4查看 1.2K关注 0票数 1

我正在尝试找出我在JPA/Hibernate上做错了什么。

我有一个包含两个表的数据库: banner和bannerlinks。

代码语言:javascript
复制
 banner
 +-------------------------------------------+
 | id | logo | studyId | textColor | bgColor |
 +-------------------------------------------+
 |  1 | xx   |  17     |  green    | red     |
 +-------------------------------------------+

 bannerlink
 +----------------------------------------+
 | id | bannerId| label | text | image    |
 +----------------------------------------+
 |  1 | 1       |  About| Abt..| xxx      |
 +----------------------------------------+
 |  2 | 1       |  Beta | Bet..| xxx      |
 +----------------------------------------+
 |  2 | 1       |  Cont | Ctc..| xxx      |
 +----------------------------------------+

和实体类。

代码语言:javascript
复制
@Entity
@Table(name="bannerlink")
public class BannerLink{
    @Id
    @GeneratedValue
    private int id;
    private String label;

    @ManyToOne
    @JoinColumn(name = "bannerId")
    private Banner banner;
    ...
}


@Entity
@Table(name = "banner")
public class Banner {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String logo;
    private String textColor;
    private String backgroundColor;
    private int studyId;

    @OneToMany(
        mappedBy = "banner",
        cascade = CascadeType.ALL,
        fetch=FetchType.LAZY,
        targetEntity = BannerLink.class
    )
    private List<BannerLink> links;

    public Banner() {
    }
    ...
 } 

我还定义了一个DAO。

代码语言:javascript
复制
public interface BannerDAO extends JpaRepository<Banner, Integer> {

    @Query("select distinct banner FROM Banner banner join BannerLink bl where banner.studyId = :studyId")
    Banner getBannerByStudyId(@Param("studyId") int studyId);
}

但是,当我运行DAO方法getBannerByStudyId时,我得到一个异常,您的SQL语法中有一个错误;请查看与您的MariaDB服务器版本相对应的手册,了解在第1行'where banner0_.studyId=17‘附近使用的正确语法。“

打印出Hibernate生成的原始SQL会显示INNER JOIN ON子句中缺少一个参数。

代码语言:javascript
复制
 Hibernate: 
     select
         distinct banner0_.id as id1_0_,
         banner0_.backgroundColor as backgrou2_0_,
         banner0_.logo as logo3_0_,
         banner0_.studyId as studyId4_0_,
         banner0_.textColor as textColo5_0_ 
     from
         banner banner0_ 
     inner join
         bannerlink bannerlink1_ 
             on 
     where
         banner0_.studyId=?

你知道我做错了什么吗?

EN

回答 4

Stack Overflow用户

发布于 2018-08-16 04:28:40

您的查询错误。正确的查询是>

代码语言:javascript
复制
"select distinct banner FROM Banner banner fetch join banner.links where banner.studyId = :studyId"

我理解您的问题的方式是,您希望获取studyId的所有横幅及其相应的链接。如果我错了,请纠正我。上面的查询正在做这项工作。

票数 1
EN

Stack Overflow用户

发布于 2018-08-16 04:28:40

你的查询是错误的。正确的查询是 >

代码语言:javascript
复制
"select distinct banner FROM Banner banner fetch join banner.links where banner.studyId = :studyId"

我理解你的问题的方式是你想获取一个 studyId 的所有横幅及其相应的链接。如果我错了,请纠正我。上面的查询正在完成这项工作。

票数 1
EN

Stack Overflow用户

发布于 2018-08-16 04:20:49

为什么你需要连接,这是一种隐式过滤器吗?正如我所看到的,studyId在Banner中,所以只需删除查询并将函数名称更改为findOneByStudyId。还要删除Param注释。然后,如果您需要链接信息,只需调用getter,它就会延迟获取。但是如果你需要这个连接,我会写成这样(未测试):SELECT DISTINCT b FROM Banner b,BannerLink bl WHERE b.studyId = :studyId

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51865256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档