找不到 int 类型的属性时间戳!遍历路径:记分卡



尝试运行 Spring 启动应用程序时,我收到以下错误。

1:

org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为"userStatsController"的 bean 时出错

阿拉伯数字:

创建名为"scoreCardRepository"的 Bean 时出错:调用 init 方法失败;嵌套异常为 java.lang.IllegalArgumentException: 无法创建方法查询 public abstract java.util.List.microservices.book.gamification.repository.ScoreCardRepository.findByUserIdOrderByScoreTimestampDesc(java.lang.Long(! 找不到 int 类型的属性时间戳!遍历路径: 记分卡.

我正在使用 H2 数据库。

记分卡存储库.java

public interface ScoreCardRepository extends CrudRepository<ScoreCard, Long> {
@Query("SELECT SUM(s.score) FROM microservices.book.gamification.domain.ScoreCard s WHERE s.userId = :userId GROUP BY s.userId")
int getTotalScoreForUser(@Param("userId") final Long userId);
@Query("SELECT NEW microservices.book.gamification.domain.LeaderBoard(s.userId, SUM(s.score))"
+ "FROM microservices.book.gamification.domain.ScoreCard s "
+ "GROUP BY s.userId ORDER BY SUM(s.score) DESC")
List<LeaderBoardRow> findFirst10();
List<ScoreCard> findByUserIdOrderByScoreTimestampDesc(Long userId);
}

记分卡.java

@Entity
public class ScoreCard {
public static final int DEFAULT_SCORE = 20;
@Id
@GeneratedValue
@Column(name = "CARD_ID")
private Long cardId;
@Column(name = "USER_ID")
private Long userId;
@Column(name = "ATTEMPT_ID")
private Long attemptId;
@Column(name = "SCORE_TS")
private long scoreTimeStamp;
@Column(name = "SCORE")
private int score;
public ScoreCard() {
}
public ScoreCard(Long userId, Long attemptId) {
this.cardId = null;
this.userId = userId;
this.attemptId = attemptId;
this.scoreTimeStamp = System.currentTimeMillis();
this.score = DEFAULT_SCORE;
}
public Long getCardId() {
return cardId;
}
public Long getUserId() {
return userId;
}
public Long getAttemptId() {
return attemptId;
}
public long getScoreTimeStamp() {
return scoreTimeStamp;
}
public int getScore() {
return score;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attemptId == null) ? 0 : attemptId.hashCode());
result = prime * result + ((cardId == null) ? 0 : cardId.hashCode());
result = prime * result + score;
result = prime * result + (int) (scoreTimeStamp ^ (scoreTimeStamp >>> 32));
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ScoreCard other = (ScoreCard) obj;
if (attemptId == null) {
if (other.attemptId != null)
return false;
} else if (!attemptId.equals(other.attemptId))
return false;
if (cardId == null) {
if (other.cardId != null)
return false;
} else if (!cardId.equals(other.cardId))
return false;
if (score != other.score)
return false;
if (scoreTimeStamp != other.scoreTimeStamp)
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
@Override
public String toString() {
return "ScoreCard [cardId=" + cardId + ", userId=" + userId + ", attemptId=" + attemptId + ", scoreTimeStamp="
+ scoreTimeStamp + ", score=" + score + "]";
}
}

UserStatsController.java

@RestController
@RequestMapping("/stats")
public class UserStatsController {
private GameService gameService;
@Autowired
public UserStatsController(GameService gameService) {
this.gameService = gameService;
}
@GetMapping
public GameStats getStatsForUser(@RequestParam("userId") Long userId) {
return gameService.retrieveStatsForUser(userId);
}
}

应用程序属性

server.port=8081
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:h2:file:~/gamification;DB_CLOSE_ON_EXIT=FALSE;
spring.jpa.properties.hibernate.show_sql=true

您应该将findByUserIdOrderByScoreTimestampDesc更改为findByUserIdOrderByScoreTimeStampDesc

解释: 实体类的属性必须与默认命名策略匹配 (除非专门配置。

我希望,这有效。

实体类的属性名称为scoreTimeStamp(时间戳字的大写字母为 s(,但在方法声明中,属性名称为ScoreTimestamp(时间戳字为小写字母(。

PS:根据您在问题和以下评论中提供的信息,这应该只是问题所在。

最新更新