使用spring-boot-starter-data-jpa遇到的一个SQL转义字符问题 JPA的BUG?
在这里想定义一个用户表关联查询出部门名称,定义视图来查询是没有问题的,如果想简化一下不用视图直接在类里定义sql,这里的sql文本的.(点)会被替换为_(下划线)造成无法查询出来想来的数据,不知道是不是JPA的BUG,找了半天没有找到这个点的转换字符
想简单点都不行
在类里定义了
@Table(name=" (select u003.id AS id,u003.name AS name,u003.address AS address,u003.phone AS phone,u003.remark AS remark,"
+" u003.id_dep AS id_dep,dep003.name AS dep_name "
+" from user u003 left join department dep003 on u003.id_dep = dep003.id )" )
问题现象
将打印出来的sql格式化一眼就能看到
定义
@Entity
//@Table(name = "user_view")//正确可以用的 视图
//@Table(name = " (select * from user_view) ")//正确可以用的 视图查询
@Table(name=" (select u003.id AS id,u003.name AS name,u003.address AS address,u003.phone AS phone,u003.remark AS remark,"
+" u003.id_dep AS id_dep,dep003.name AS dep_name "
+" from user u003 left join department dep003 on u003.id_dep = dep003.id )" )
public class UserView implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", nullable = false)
private Long id;
@Column(nullable = false, name = "name")
private String name;
@Column(nullable = true, name = "address")
private String address;
@Column(nullable = true, name = "phone")
private String phone;
@Column(nullable = true, name = "remark")
private String remark;
@Column(name = "id_dep", nullable = true)
private Long idDep;
@Column(name = "dep_Name", nullable = true)
private String depName;
//....略 set get....
}
表结构
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`remark` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES ('1', '管理部门', 'A');
INSERT INTO `department` VALUES ('2', '代码部门', 'B');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`phone` varchar(30) DEFAULT NULL,
`remark` varchar(200) DEFAULT NULL,
`id_dep` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('20', 'AAA', 'sa', 'xxxxxxx', '说明', '1');
INSERT INTO `user` VALUES ('21', '1212', 'asdf', '444', '说明', '2');
INSERT INTO `user` VALUES ('22', 'AAAAA', '', '', '', null);
INSERT INTO `user` VALUES ('23', 'ASDFSADF', '', '', '', null);
INSERT INTO `user` VALUES ('24', '23232', '', '', '', null);
-- ----------------------------
-- View structure for user_view
-- ----------------------------
DROP VIEW IF EXISTS `user_view`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `user_view` AS select `u`.`id` AS `id`,`u`.`name` AS `name`,`u`.`address` AS `address`,`u`.`phone` AS `phone`,`u`.`remark` AS `remark`,`u`.`id_dep` AS `id_dep`,`dep`.`name` AS `dep_name` from (`user` `u` left join `department` `dep` on((`u`.`id_dep` = `dep`.`id`))) ;