Я сталкиваюсь со следующей ошибкой, когда JPA пытается сопоставить результат запроса с методом репозитория результатов DTO:
org.hibernate.hql.internal.ast.QuerySyntaxException:
Unable to locate appropriate constructor on class [com.example.dto.User]. Expected arguments are: java.lang.String, java.lang.String, com.example.repository.DbRole
Я использую плагин spring-boot-starter-data-jpa
и org.jetbrains.kotlin.plugin.jpa
в моем Kotlin проект. У меня есть репозиторий, определенный следующим образом:
@Repository
internal interface JdbcUserRepository : UserRepository, JpaRepository<DbUser, String> {
override fun findUserByUsername(username: String): User?
}
Обратите внимание, что тип, используемый JpaRepository (DbUser), отличается от того, который был перенастроен методом findUserByUsername (User), а также на ошибку выше класса User правильно найдено JPA ( ... class [com.example.dto.User] ... ), но роль - нет. Он ожидает DbRole в целевом DTO, что не так.
DbUser - аннотированный класс @Entity и ссылается на другой аннотированный класс @Entity, называемый DbRole. Оба определены ниже:
@Entity
@Table(name = "user")
internal data class DbUser(
@Id @Column val username: String,
@Column val password: String,
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = [JoinColumn(name = "username", referencedColumnName = "username")],
inverseJoinColumns = [JoinColumn(name = "role_id", referencedColumnName = "id")]
) val roles: List<DbRole>
)
@Entity
@Table(name = "role")
internal data class DbRole(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long,
@Column val roleName: String,
@Column val description: String
)
А ниже приведены классы, в которых JPA должен сопоставлять результаты с:
data class User(
val username: String,
val password: String,
val roles: List<Role>
)
data class Role(val roleName: String, val description: String)
Кто-нибудь знает, как решить эту проблему, и JPA правильно находит и сопоставляет Вложенный список сущностей DbRole во вложенный список DTO Role?