2016-12-03 22 views
0

我在嘗試選擇與給定用戶關聯的最新添加鍛鍊集。選擇用戶設置的最新鍛鍊

用戶的會話和會話已設置。我的實體定義如下。

  @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! 

任何線索關於如何做que對嗎?我對其他方法也很開放,因爲如果可能的話,我寧願避免編寫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); 
} 

注聯接子句中的差異。這適用於hibernate 5.0.11。