JPJ

时间:2017-09-14 09:46:04

标签: hibernate jpa spring-boot jpql

我正在尝试使用jpa的自定义查询(不是nativeQuery,因为我想将结果映射到自定义对象),我无法弄清楚什么是错误的。

存储库类如下所示:

@Repository
public interface ChallengeCompletionRepository extends JpaRepository<ChallengeCompletion, Integer>{
    List<ChallengeCompletion> findByUser(int uid);
    List<ChallengeCompletion> findByChallenge(int cid);
    List<ChallengeCompletion> findByUserAndChallenge(int uid, int cid);

    @Query(value = "SELECT new com.some.rly.long.package.name.ChallengeScore(user_id, count(id)) " +
        "FROM ChallengeCompletion " +
        "WHERE challenge_id = :cid " +
        "GROUP BY user_id " +
        "ORDER BY count(id) DESC")
   List<ChallengeScore> fetchUserScoreForChallenge(@Param("cid") int cid);
}

我希望结果列表的模型类看起来像这样:

@Data
@NoArgsConstructor
public class ChallengeScore {

    public ChallengeScore(UUID userId, int score){
        this.score = score;
        this.userId = userId;
    }

    private int score;
    private User user;

    @JsonIgnore
    private UUID userId;

}

这是ChallengeCompletion的模型:

@Entity
@Data
@Table(name = "challenge_completions")
public class ChallengeCompletion extends BaseModel{

    @ManyToOne
    @JsonBackReference
    private User user;

    @ManyToOne
    private Challenge challenge;

    @ManyToOne
    private Project project;

}

基础模型是:

@MappedSuperclass
@Data
public abstract class BaseModel {

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

    @CreationTimestamp
    private Timestamp createdAt;

    @UpdateTimestamp
    private Timestamp updatedAt;
}

错误很简单:“查询失败验证...”。我也觉得有点奇怪,我需要使用我想要构建的类的完全限定名称,但这可能是因为该类不是真正的@Entity而不是得到自动加载。

可以在此处找到完整的堆栈跟踪:https://pastebin.com/MjP0Xgz4

对于上下文,此Query应该执行的操作是:用户可以多次完成chaillanges。每次完成都会在ChallengeCompletion中记录为一行。我想获得一份不同用户(ID)列表以及他们完成某项挑战的频率。

干杯

编辑:感谢@ DN1的评论,如果你不想提供一个挑战对象而只是一个id,那么我发现你确实可以做cc.challenge.id之类的事情,我可以让它工作。

@Query(value = "SELECT new com.energiedienst.smartcity.middleware.module.challenge.model.ChallengeScore(cc.user, count(cc.id)) " +
        "FROM ChallengeCompletion cc " +
        "WHERE cc.challenge.id = :cid " +
        "GROUP BY cc.user " +
        "ORDER BY count(cc.id) DESC")
List<ChallengeScore> fetchUserScoreForChallenge(@Param("cid") int cid);

ChallengeScore类现在看起来像:

@Data
@NoArgsConstructor
public class ChallengeScore {

    public ChallengeScore(User user, long score){
        this.score = score;
        this.user = user;
    }

    private long score;
    private User user;

}

1 个答案:

答案 0 :(得分:2)

异常的原因是您正在使用JPQL,而JPQL使用类/字段名称而不是表/列名称(SQL使用的是什么)。 user_idchallenge_id似乎是列名,您需要更改它们以使用字段名称。有关详细信息,请参阅this guide