【问题标题】:Selecting latest workout set by user选择用户最新的锻炼设置
【发布时间】:2016-12-03 23:19:18
【问题描述】:

我正在尝试选择与给定用户关联的最新添加的锻炼组。

用户有会话,会话有集合。我的实体定义如下。

            @Entity(name = "users") // Postgres doesn't like the table name "user"
            public class User {
                @Id
                @GeneratedValue(strategy = GenerationType.IDENTITY)
                private long id;
                @OneToMany(mappedBy = "user")
                private Set<Session> sessions;
            ...

            @Entity
            public class Session {
                @Id
                @GeneratedValue(strategy = GenerationType.IDENTITY)
                private long id;
                @ManyToOne
                private User user;
                @OneToMany(mappedBy = "session")
                private Set<WorkoutSet> sets;
            ...

            @Entity
            public class WorkoutSet {
                @Id
                @GeneratedValue(strategy = GenerationType.IDENTITY)
                private long id;
                @OneToOne
                private User user;
                @ManyToOne
                private Session session;
                private LocalDateTime timestamp = LocalDateTime.now();
            ...

下面的 sql 查询似乎可以解决问题

select w
from workout_set w
  inner join session s
  on w.session_id = s.id
where s.user_id = 1
order by w.timestamp DESC
limit 1

但是当我试图做类似下面的事情时

            @Repository
            public interface WorkoutSetRepository extends CrudRepository<WorkoutSet, Long> {
                @Query("select w from WorkoutSet w inner join Session s on w.session_id = s.id where s.user = :user order by w.timestamp")
                List<WorkoutSet> findLastSet(User user, Pageable limit);

我明白了……

org.springframework.data.mapping.PropertyReferenceException: No property user found for type WorkoutSet!

关于如何正确进行查询的任何线索?我也对替代方法持开放态度,因为如果可能的话,我宁愿避免编写 jpql。

【问题讨论】:

    标签: spring jpa spring-data jpql


    【解决方案1】:

    试试这个:

    @Repository
    public interface WorkoutSetRepository extends CrudRepository<WorkoutSet, Long> {
        @Query("select w from WorkoutSet w inner join w.session s where s.user = :user order by w.timestamp")
        List<WorkoutSet> findLastSet(@Param("user") TestUser user);
    }
    

    注意连接子句的区别。这适用于休眠 5.0.11。

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 2017-01-09
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多