首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用的智慧查询

使用的智慧查询
EN

Stack Overflow用户
提问于 2018-08-11 11:11:48
回答 1查看 34关注 0票数 0

建议,我有下一个物体的结构:

代码语言:javascript
复制
class MovieWrapper {
    private Movie movie;
}
class Movie {
    private User user;
    @Enumerated(EnumType.STRING)
    private Status status;
}

我只想通过用户Id和状态处于活动或挂起的位置从存储库查询MovieWrapper的第一次出现:

代码语言:javascript
复制
@Repository
public interface MovieWrapperRepository extends JpaRepository<MovieWrapper, Long> {
    MovieWrapper findFirstByMovieUserIdAndMovieStatusActiveOrMovieStatusPending(Long userId);
}

如何正确地做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 11:45:52

要从回购方法中获得“自定义”对象,您应该使用预测 (接口基投影更好,IMO)。

要实现复杂方法,您可以自己构建其查询,例如:

代码语言:javascript
复制
public interface MovieRepo extends JpaRepository<Movie, Long> {
    Query("select m as movie from Movie m where m.user.id = ?1 and (m.status = 'ACTIVE' or m.status = 'PENDING')")
    List<MovieProjection> findActiveOrPending(Long userId, Status status);
}

其中MovieProjection是一个简单的接口:

代码语言:javascript
复制
public interface MovieProjection {
    Movie getMovie();
}

注意,对于查询中的别名m as movie,建议与投影一起使用,以避免某些错误。

更新

如果你只需要一个记录,你可以用一个技巧Pageable

代码语言:javascript
复制
public interface MovieRepo extends JpaRepository<Movie, Long> {
    Query("select m as movie from Movie m where m.user.id = ?1 and (m.status = 'ACTIVE' or m.status = 'PENDING')")
    List<MovieProjection> findAllActiveOrPending(Long userId, Status status, Pageable pageable);

    default Optional<MovieProjection> getFirstOne(Long userId, Status status) {
        return findAllActiveOrPending(userId, status, PageRequest.of(0, 1)).stream().findAny();
    }
}

这里我们取第一页有一个记录(PageRequest.of(0, 1) -参见这里)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51799079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档