V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
HarryQu
V2EX  ›  MySQL

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

  •  
  •   HarryQu · 2018-10-18 18:19:58 +08:00 · 3066 次点击
    这是一个创建于 1988 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    两张表 : 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
    
    
    
    15 条回复    2018-10-19 14:37:56 +08:00
    allen9527
        1
    allen9527  
       2018-10-18 18:29:23 +08:00
    left outer join order 关键字了?
    moresteam
        2
    moresteam  
       2018-10-18 18:35:03 +08:00 via Android
    楼主可以表述的专业点吗。。
    moshao6
        3
    moshao6  
       2018-10-18 18:38:10 +08:00
    order 本身就是关键字 怎么会起这样的表名
    liprais
        4
    liprais  
       2018-10-18 18:40:18 +08:00
    保留字做表名,佩服
    zdt3476
        5
    zdt3476  
       2018-10-18 18:58:05 +08:00
    order 做表名导致的。。。 看下是否能用反引号包起来,`Order` 或者是换个名字
    oyosc
        6
    oyosc  
       2018-10-18 19:01:04 +08:00
    楼主新手?
    wuwuwu5
        7
    wuwuwu5  
       2018-10-18 19:04:34 +08:00
    换个表名,我以前还用 group 做过表名😢。
    metrxqin
        8
    metrxqin  
       2018-10-18 19:17:23 +08:00
    外键约束已经被业务唾弃。
    littleylv
        9
    littleylv  
       2018-10-18 19:20:02 +08:00
    我一般表名用复数
    users
    orders
    就不会与关键字冲突
    或者你的 sql 应该用 `user` 、 `order`
    johnniang
        10
    johnniang  
       2018-10-18 19:39:54 +08:00 via Android
    @littleylv JPA 没办法做到自动加上``
    PythonAnswer
        11
    PythonAnswer  
       2018-10-18 19:40:45 +08:00 via iPhone
    加下划线 这样能强迫自己记住关键字
    kslr
        12
    kslr  
       2018-10-18 19:54:20 +08:00 via Android
    复数哦同志
    947211232
        13
    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
        14
    nekoneko  
       2018-10-19 08:57:32 +08:00
    一般没个几年经验不敢用 JPA 或者 Hibernate 的映射
    HarryQu
        15
    HarryQu  
    OP
       2018-10-19 14:37:56 +08:00
    @moshao6 之前没有意识到这是一个关键字,只是把它当成 订单 - Order
    @metrxqin 因为我对 mysql 了解不深 , 图省事想通过级联更新和级联删除减少些数据库操作。查了点资料 , 猛的发现外键的局限性,谢谢提醒。
    @littleylv 好主意 , 我查了点资料 ,决定以 t_ 开头,避免这种错误。
    @947211232 我通过 jpa hibernate 操作 mysql 数据库,上面的 sql 语句是 hibernate 生产的,因此命名有有点乱 。
    @nekoneko 确实,细节都被封装起来,对于我这种新手,一不小心就踩坑了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2518 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.