#postgresql #spring-boot #kotlin #spring-data-jpa
#postgresql #весенняя загрузка #kotlin #spring-data-jpa
Вопрос:
У меня есть следующий запрос, определенный в CrudRepository:
interface RoundRepository : CrudRepository<Round, Long> {
fun findByGameId(id: Long): Round?
@Query("select r from Round r where r.game.id like ?1 order by r.createdAt desc")
fun findLastByGameId(id: Long) : List<Round>
}
Объекты Game и Round определяются следующим образом:
@Entity
class Game(
@ManyToOne(optional = false)
@JoinColumn(name = "firstplayer_id", referencedColumnName = "id")
var firstPlayer: User,
@ManyToOne(optional = false)
@JoinColumn(name = "secondeplayer_id", referencedColumnName = "id")
var secondPlayer: User,
@Size(min = 6, max = 60)
var gameName: String,
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id: Long = 0,
@DateTimeFormat
val createdAt: Date = Date.from(Instant.now())
) {
@OneToMany(mappedBy = "game")
lateinit var rounds: Collection<Round>
}
@Entity
@Table(name = "round")
class Round(
@ManyToOne
@JoinColumn(name="game_id", referencedColumnName = "id")
var game: Game,
var cancelled: Boolean = false,
var ended: Boolean = false,
var winner: Winner = Winner.FIRST_PLAYER,
var stateFirstPlayer: Int = -1,
var stateSecondPlayer: Int = -1,
var moveIndexFirstPlayer: Int = -1,
var moveIndexSecondPlayer: Int = -1,
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id: Long = 0,
@DateTimeFormat
val createdAt: Date = Date.from(Instant.now())
) {
@Transient
lateinit var firstPlayerMoves: Collection<Move>
@Transient
lateinit var secondPlayerMoves: Collection<Move>
@Transient
lateinit var firstPlayerPositions: PlanesPositions
@Transient
lateinit var secondPlayerPositions: PlanesPositions
}
При вызове метода следующим образом:
var game: Game? = gamesRepository.findByGameName(gameName)
?: throw GameDoesNotExistException("A game with this name does not exist");
var rounds = roundRepository.findLastByGameId(game?.id!!)
Я получаю исключение: org.hibernate.exception.Исключение SQLGrammarException: не удалось извлечь результирующий набор
Внутреннее исключение из Postgres гласит: org.postgresql.util.Исключение PSQLException: ОШИБКА: оператор не существует: bigint ~~ bigint
Изначально в поле game_id в круглой таблице не было спецификации not null. Итак, я подумал, что это проблема. Теперь я исправил это, но я все еще получаю ту же ошибку. Кто-нибудь может помочь?
Комментарии:
1. Заменить
r.game.id like ?1
наr.game.id = ?1
. Числовые значения не могут быть сопоставлены с шаблоном, как строка.2. Большое спасибо. Это решило проблему.