首页 > 解决方案 > 如何使用非实体表在 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!```

标签: javaspringhibernatespring-data-jpa

解决方案


让我们一步一步看: 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


推荐阅读