我正在尝试找出我在JPA/Hibernate上做错了什么。
我有一个包含两个表的数据库: banner和bannerlinks。
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 |
+----------------------------------------+和实体类。
@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。
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子句中缺少一个参数。
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=?你知道我做错了什么吗?
发布于 2018-08-16 04:28:40
您的查询错误。正确的查询是>
"select distinct banner FROM Banner banner fetch join banner.links where banner.studyId = :studyId"我理解您的问题的方式是,您希望获取studyId的所有横幅及其相应的链接。如果我错了,请纠正我。上面的查询正在做这项工作。
发布于 2018-08-16 04:28:40
你的查询是错误的。正确的查询是 >
"select distinct banner FROM Banner banner fetch join banner.links where banner.studyId = :studyId"我理解你的问题的方式是你想获取一个 studyId 的所有横幅及其相应的链接。如果我错了,请纠正我。上面的查询正在完成这项工作。
发布于 2018-08-16 04:20:49
为什么你需要连接,这是一种隐式过滤器吗?正如我所看到的,studyId在Banner中,所以只需删除查询并将函数名称更改为findOneByStudyId。还要删除Param注释。然后,如果您需要链接信息,只需调用getter,它就会延迟获取。但是如果你需要这个连接,我会写成这样(未测试):SELECT DISTINCT b FROM Banner b,BannerLink bl WHERE b.studyId = :studyId
https://stackoverflow.com/questions/51865256
复制相似问题