一、问题
JAP执行查询方法时,打印的SQL语句有误,from关键词后接的另一张表。
fun findByIdAndUid(id: Long, uid: Long):TaskEntity?
二、原因
项目中存在多个同名User实体类,映射时@Entity注解默认使用Unqualified name。这将导致同名映射覆盖或启动报错。
- com.xxx.a.User
package com.xxx.a
@Entity()
@Table(name = "user", schema = "xxxA_user", catalog = "xxxA_user")
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
var id: Long,
)
-
com.xxx.b.c.User
package com.xxx.b.c
@Entity()
@Table(name = "user", schema = "xxxBC_user", catalog = "xxxBC_user")
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
var id: Long,
)
三、解决办法
方法有两种方式,目的在于解决HQL映射失败问题。
- User实体类中@Entity使用全路径赋值name(推荐)
package com.xxx.a @Entity(name = "com.xxx.a.User") @Table(name = "user", schema = "xxxA_user", catalog = "xxxA_user") data class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) var id: Long, )
- 持久层方法添加@Query注解,带路径指定实体类
@Query("select * from com.xxx.a.User where id = ?1 and uid = ?2") fun findByIdAndUid(id: Long, uid: Long):TaskEntity?
参考:
使用hibernate的annotation如何设置一个实体类的auto-import=false(4楼回复)——islandrabbit