Mysql 查询遇到的一个问题,我错在哪里了 ?

2018-10-18 18:19:58 +08:00
 HarryQu

查询问题卡了一个多个小时,特来求助 。

两张表 : User 表 和 Order 表。 User 有多个 Order。 Order 只能有一个 User。

代码如下图 : User 表 :

Order 表 :


需求 : 根据 User 的 id 返回 User 对象 。


我使用的方法 : 直接通过 jpa 查询

   Optional<User> optional = userDao.findById(userId);

遇到的问题 : 查询过程,直接报错 :

Hibernate show sql :

select user0_.id as id1_1_0_, 
 user0_.age as age2_1_0_,
 user0_.name as name3_1_0_, user0_.sex as sex4_1_0_,
 customer1_.user_id as user_id2_0_1_,
 customer1_.order_id as order_id1_0_1_,
 customer1_.order_id as order_id1_0_2_, 
 customer1_.user_id as user_id2_0_2_ from user user0_ left outer join order customer1_ on user0_.id=customer1_.user_id where user0_.id=?
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order customer1_ on user0_.id=customer1_.user_id where user0_.id=?' at line 7
> Time: 0s


3102 次点击
所在节点    MySQL
15 条回复
allen9527
2018-10-18 18:29:23 +08:00
left outer join order 关键字了?
moresteam
2018-10-18 18:35:03 +08:00
楼主可以表述的专业点吗。。
moshao6
2018-10-18 18:38:10 +08:00
order 本身就是关键字 怎么会起这样的表名
liprais
2018-10-18 18:40:18 +08:00
保留字做表名,佩服
zdt3476
2018-10-18 18:58:05 +08:00
order 做表名导致的。。。 看下是否能用反引号包起来,`Order` 或者是换个名字
oyosc
2018-10-18 19:01:04 +08:00
楼主新手?
wuwuwu5
2018-10-18 19:04:34 +08:00
换个表名,我以前还用 group 做过表名😢。
metrxqin
2018-10-18 19:17:23 +08:00
外键约束已经被业务唾弃。
littleylv
2018-10-18 19:20:02 +08:00
我一般表名用复数
users
orders
就不会与关键字冲突
或者你的 sql 应该用 `user` 、 `order`
johnniang
2018-10-18 19:39:54 +08:00
@littleylv JPA 没办法做到自动加上``
PythonAnswer
2018-10-18 19:40:45 +08:00
加下划线 这样能强迫自己记住关键字
kslr
2018-10-18 19:54:20 +08:00
复数哦同志
947211232
2018-10-19 08:56:31 +08:00
代码的话应该:
@Table(name="order")

@Table(name="`order`"),

关键词作表名、字段属性的话用``包括

sql 的话应该:
left outer join order customer1_ on user0_.id=customer1_.user_id where user0_.id=?

left outer join `order` customer1_ on user0_.id=customer1_.user_id where user0_.id=?


LZ 有点瑕疵就是库名、表名、别名太乱
nekoneko
2018-10-19 08:57:32 +08:00
一般没个几年经验不敢用 JPA 或者 Hibernate 的映射
HarryQu
2018-10-19 14:37:56 +08:00
@moshao6 之前没有意识到这是一个关键字,只是把它当成 订单 - Order
@metrxqin 因为我对 mysql 了解不深 , 图省事想通过级联更新和级联删除减少些数据库操作。查了点资料 , 猛的发现外键的局限性,谢谢提醒。
@littleylv 好主意 , 我查了点资料 ,决定以 t_ 开头,避免这种错误。
@947211232 我通过 jpa hibernate 操作 mysql 数据库,上面的 sql 语句是 hibernate 生产的,因此命名有有点乱 。
@nekoneko 确实,细节都被封装起来,对于我这种新手,一不小心就踩坑了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/498872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX