java - 如何使用非实体表在 Spring Boot 上创建自定义 @Query?
问题描述
我被困在一个简单的朋友模式中。我有一个用户实体,它有一个用户列表作为朋友。Spring 正在为我创建 tbl_friends,它将保留连接的数据,就像我将用户 1 设置为用户 3 和用户 4 的朋友一样。当我选择 user1 时,它会得到 user3 和 user4 作为朋友。这工作正常,但我想做的是当我得到 user3 时,它会保留它与 user1 成为朋友的信息。
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String userName;
private String fullName;
private String phoneNumber;
private String email;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name="TBL_FRIENDS",
joinColumns=@JoinColumn(name="person_id"),
inverseJoinColumns=@JoinColumn(name="friend_id")
)
private List<User> friends;
@JsonIgnore
@ManyToMany(mappedBy = "friends")
private List<User> friendOf;
在常规的 SQL 查询中,我要做的就是获取 user3 的用户朋友列表:
SELECT user.id, user.full_name, FROM user INNER JOIN tbl_friends f ON user.id = f.person_id WHERE f.friend_id = 3 ; // (this code actually works on h2-console to check the tables created by spring jpa)
当我尝试在 UserRepository 中做类似的事情时,它会给出错误,因为它需要一个路径(?)
@Query("SELECT u FROM User u INNER JOIN tbl_friends f ON User.id = f.personId WHERE f.friendId = :objId")
List<User> findByFriendsId(@Param("objId") Integer friend_id);```
**This the error: **
```2020-05-04 18:39:55.660 INFO 22292 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-05-04 18:39:55.666 INFO 22292 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-05-04 18:39:55.694 WARN 22292 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Unable to start LiveReload server
2020-05-04 18:39:55.995 ERROR 22292 --- [ restartedMain] o.h.hql.internal.ast.ErrorTracker : Path expected for join!
2020-05-04 18:39:56.000 ERROR 22292 --- [ restartedMain] o.h.hql.internal.ast.ErrorTracker : Path expected for join!
antlr.SemanticException: Path expected for join!```
解决方案
让我们一步一步看: 1. 它是非实体表 - 所以它是否会导致问题,你做对了吗?2. 您正在尝试使用 Spring Data JPA 进行本机查询调用
故障排除试用 1. 从第 2 部分尝试故障排除,因为它很简单,您应该尝试以下方法:
仅仅提及@Query 是不够的。见下文,需要注意的重要部分是“nativeQuery=true”
@Query(value = "SELECT u FROM User u INNER JOIN tbl_friends f ON User.id = f.personId WHERE f.friendId = :objId", nativeQuery = true)
故障排除试验 2:如果上述方法不起作用,请跳至第 1 部分。网络上有一些很好的答案。我在这里粘贴一个这样好的线程的链接:Spring Data JPA map the native query result to Non-Entity POJO
推荐阅读
- sortablejs - 知道哪个 div 是 Sortable.js 的目标
- angular - 尝试向 API(Angular、TypeScript、RxJS)发出多个请求时出现 TypeScript 可观察到的错误
- python - 用零填充 pandas 数据帧上的行,直到 N 计数
- mysql - mysql中解码Base64列显示BLOB
- rust - Near-bindgen 宏:不支持的参数类型
- javascript - 无法使用cdn加载axios
- python - 如何从 Python 列表和 str 生成唯一名称
- python-3.x - 如何使用 GUI 和 netmiko 正确使用函数
- ios - SwiftUI:多平台应用程序 swiftui 意外的平台条件
- nix - 全局覆盖包 virtualbox 来宾添加(即使在 NixOS 模块中)