有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用非实体表在Spring Boot上创建自定义@Query?

我陷入了一个简单的朋友模式。我有一个用户实体,它有一个作为朋友的用户列表。Spring正在为我创建一个tbl_好友,它将保存加入的数据,就像我将用户1设置为user3和user4的好友一样。当我选择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) 个答案

  1. # 1 楼答案

    让我们一步一步来看看: 1.它是非实体表-那么它是导致问题的原因吗?您的方法是否正确? 2.您正在尝试使用Spring数据JPA进行本机查询调用


    故障排除试验1。尝试从第二部分进行故障排除,因为它很简单,以下是您应该尝试的:

    仅仅提到@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