当前位置: 首页 > 知识库问答 >
问题:

JPQL的Spring Boot JPA“查询验证失败”错误

姜嘉良
2023-03-14

我正在尝试使用一个带有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;

}

这是挑战完成的模型:

@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

对于上下文,这个查询应该做的是:用户可以多次完成查询。每次完成都记录为ChallengeCompletion中的一行。我想得到一个不同用户(ID)的列表,以及他们完成某项挑战的频率。

干杯

编辑:感谢@DN1的评论,我可以在发现你确实可以做一些像cc.challenge.id这样的事情后,如果你不想给一个挑战对象,而只是一个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);

挑战者核心课程现在看起来像:

@Data
@NoArgsConstructor
public class ChallengeScore {

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

    private long score;
    private User user;

}

共有1个答案

百里承业
2023-03-14

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

 类似资料:
  • 问题内容: 我实现查询返回自定义对象中的输出。在执行过程中,出现错误: “方法公共抽象java.util.List org.degs.repository.ConsolidateresponseRepository.transactions()!” JPQL存储库代码: 豆: 如果我在mysql db终端中运行相同的查询,我已经在查询本身中处理了空值并获得了正常的输出,但是在JPA和Spring

  • 我正在尝试创建一个JPaRepository,代码如下,带有一个select查询和insert查询, 存储库代码: 实体代码: 但是插入查询中不断出现以下错误, 单独使用select查询可以很好地工作,但是当我添加insert查询时,会出现错误。我想不出问题出在哪里。

  • 我正在一个简单的Java程序中测试图-spqr天秤座。 这是我目前所做的: 然后,我在main方法中调用构建GraphQL方法 我有错误:查询无法验证:“{status(id:123){status}}” 怎么了?

  • 我正在使用Hibernate和Spring创建RESTAPI。我正在将培训师映射到mySQL中的表 和 实体: 以下是回购代码: @Query(value=“SELECT*from trainers,其中account_id为null”,nativeQuery=true)List getTrainerNoAccount(); 配置Sql: getTrainerNoAccount()工作正常。