簡體   English   中英

如何使用非實體表在 Spring Boot 上創建自定義 @Query?

[英]How to create a custom @Query on Spring Boot using a non Entity table?

我被困在一個簡單的朋友模式中。 我有一個用戶實體,它有一個用戶列表作為朋友。 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 數據 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 部分。web 上有一些很好的答案。 我在這里粘貼一個這樣好的線程的鏈接: Spring Data JPA map 非實體 POJO 的本機查詢結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM