Spring findByColumnName возвращает пустой список - PullRequest
2 голосов
/ 01 августа 2020

Мне нужно получить список Category из БД на основе значения столбца с именем owner. Вот мой Category -

@Entity
@Table(name = "categories")
class Category(@Column(name = "category_id", nullable = false)
                     @Id @GeneratedValue(strategyGenerationType.AUTO)
                     var id: Long = 0,

                     @Column(name = "category_owner", nullable = false)
                     @field:NotNull(message = "Please assign an owner")
                     var owner: Long?,

                     @Column(name = "category_name", nullable = false)
                     @field:NotEmpty(message = "Please assign a name")
                     var name: String?)

Вот мой интерфейс, который определяет функцию findByOwner -

interface CategoryRepository: JpaRepository<Category, Long> {
    fun findByOwner(categoryOwner: Long): List<Category>
}

Однако, когда я вызываю метод, я не получаю ответа. Я убедился, что в базе данных есть правильные данные, и предоставляю правильный идентификатор владельца. Сделали даже недействительным кеш et c. Что может быть не так?

РЕДАКТИРОВАТЬ:

После spring.jpa.show-sql=true -

findAll()

 Hibernate: select category0_.category_id as category1_0_, category0_.category_name as category2_0_, category0_.category_owner as category3_0_ from categories category0_

findByOwner()

 Hibernate: select category0_.category_id as category1_0_, category0_.category_name as category2_0_, category0_.category_owner as category3_0_ from categories category0_ where category0_.category_owner=?

РЕДАКТИРОВАТЬ 2:

Оказывается, моя реализация все время была в порядке. Ошибка была в моем service.

Ответы [ 5 ]

1 голос
/ 02 августа 2020
  • Можете ли вы поместить точку останова в класс org.springframework.data.jpa.repository.query.JpaQueryExecution, и когда вы выполните findByOwner, она появится здесь.

введите описание изображения здесь

  • Когда он достигает этой точки останова, выберите query.createQuery(accessor).getResultList() и оцените, какое значение возвращается hibernate для spring-data-jpa, чтобы использовать
1 голос
/ 01 августа 2020

Создайте именованный метод в соответствии с именем столбца.

fun findByCategoryOwner(categoryOwner: Long): List<Category>

Или используйте @ Query

@Query("SELECT * FROM categories WHERE category_owner = ?1", nativeQuery = true)
fun findByOwner(cateogryOwner: Long): List<Category
0 голосов
/ 01 августа 2020

Используйте camelCase для именования ваших переменных в классе Entity, тогда jpa автоматически распознает имя столбца

findByCategoryOwner(String categoryOwner)

Если вы все еще sh, чтобы иметь подчеркивание в именах столбцов, попробуйте это

findByCategory_Owner(String categoryOwner)

Хотя второй вариант не пробовал

0 голосов
/ 01 августа 2020

По крайней мере, в java вам необходимо указать идентификатор в имени метода:

**fun findByOwner_Id(categoryOwner: Long): List<Category>**

Поэтому измените его с findByOwner -> findByOwnerId.

0 голосов
/ 01 августа 2020

Этот пост должен вам помочь. Похоже, это происходит из-за несоответствия parameter name.

...