Как мне получить доступ к таблице многие ко многим в jpa? - PullRequest
1 голос
/ 07 марта 2020

Это пользовательский класс с отображением @manytomany, я хочу, чтобы он был однонаправленным.

@Entity
@Getter
@Setter
@Table(name="users")
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(name="user_drivers", joinColumns=@JoinColumn(name="user_id"), inverseJoinColumns=@JoinColumn(name="driver_id"))
    private Set<Driver> driverSet;

    public User() {
    }
}

Таблица создается с ключами от пользователя и драйвера, но я не знаю, как получить к ней доступ в моем хранилище.

@Query(value="select u.user_id from user_drivers")
    List<?> findAllByIdAndDriver(Long id);

Это выдает ошибку: Can 't't symbol' user_drivers '

@Query(value="select id,driverSet from User ")
    List<?> findAllByIdAndDriver(Long id);

И это приводит к исключению из запроса nester.

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

Ваш метод именования сбивает с толку. Когда вы говорите что-то вроде findByIdAndSomethingElse, вы подразумеваете, что делаете это:

SELECT * FROM MY_TABLE WHERE ID = ? AND SOMETHING_ELSE = ?;

Здесь отсутствует информация, так как вы не разделяете свой полный репозиторий или Driver реализации, но предполагаете, Вы хотите, чтобы все идентификаторы пользователей были получены из Driver с указанным c ID. Вы можете просто сделать это:

@Query("select driver.userId from Driver driver where driver.id = ?1")
public List<Long> findUserIdsByDriverId(long id);

?1 - это первый аргумент. Вы можете ссылаться на последующие аргументы с помощью ?2, ?3, ... , ?n

2 голосов
/ 07 марта 2020

Я думаю, что правильные запросы должны выглядеть так:

@Query(value="select u.userId from UserDrivers u")

и

@Query(value="select u.id, u.driverSet from User u")

Для первого запроса я предполагаю, что сущность для другой таблицы называется UserDrivers и его столбец - userId (согласно Java соглашениям об именах).

1 голос
/ 07 марта 2020

Нашел то, что мне было нужно, благодаря ответам, указавшим мне правильное направление.

@Query(value="select u.driverSet from User u where u.id=?1")
    List<?> getDriverSet(Long id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...