Как выполнить запрос "in" для jpa's @ManyToOne JoinColumn, не запрашивая объект - PullRequest
0 голосов
/ 11 марта 2020

У меня есть такая сущность:

@Entity
class Blog{
    @Id
    private Long id;

    // ...
    @ManyToOne
    @JoinColumn(name = "author_id")
    private User author;
}

И я хочу выполнить запрос in для столбца author, поэтому я написал BlogRepository как:

public interface BlogRepository extends JpaRepository<Blog, Long>, CustomizedBlogRepository {

    Page<Blog> findByUserIn(Collection<User> users, Pageable pageable);
}

Это работает, однако мне нужно выполнить два запроса для одного запроса, то есть запросить User сущность из UserRepository, чтобы получить Collection<User> users. Потому что во многих ситуациях все, что мне нужно, это semanti c, например:

select * from blog where author_id in (some_id_list);

Так есть ли в jpa все-таки, чтобы я мог выполнить запрос, как показано ниже, без запроса сущности User?

Ответы [ 2 ]

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

Часть Order вашего метода мешает. Поскольку вы не хотите заказывать результаты, вы можете использовать это:

public interface BlogRepository extends JpaRepository<Blog, Long>, CustomizedBlogRepository {

    Page<Blog> findByUser_IdIn(Collection<Long> userId, Pageable pageable);
}
0 голосов
/ 11 марта 2020

Да, вы также можете написать собственный JPQL

publi c интерфейс BlogRepository расширяет JpaRepository, CustomizedBlogRepository {

@Query("select b from Blog b LEFT JOIN b.author.authorId in :authorIds")
Page<Blog> getByUsersByIds(List<Integer> authorIds, Pageable pageable);

}

Здесь вы можете изменить authorId на любой Идентификатор таблицы пользователя, которую вы создали. И вы также можете попробовать JOIN вместо LEFT JOIN

...