Как создать собственный @Query при загрузке Spring с использованием таблицы, отличной от Entity? - PullRequest
1 голос
/ 05 мая 2020

Я застрял в простой схеме друзей. У меня есть объект "Пользователь", у которого есть список друзей в качестве друзей. Spring создает для меня tbl_friends, который будет хранить данные соединения, например, я установил пользователя 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 Ответ

0 голосов
/ 05 мая 2020

Давайте рассмотрим это шаг за шагом: 1. Это не таблица сущностей - значит, проблема возникает, вы все сделали правильно? 2. Вы пытаетесь выполнить вызов Native Query, используя 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 сопоставляет собственный результат запроса с POJO без сущности

...