Spring Data JDB C org.springframework.data.mapping.MappingException: не удалось прочитать значение rental_mov ie из набора результатов - PullRequest
2 голосов
/ 01 мая 2020

Как выбрать фильтр запроса в отношениях один к одному с Spring Data JDB C?

Схема выглядит следующим образом, в основном 2 таблицы, где Аренда ссылки Mov ie

drop table if exists rental;
drop table if exists movie;

create table movie
(
    id          serial primary key,
    title       text,
    description text
);

create table rental
(
    movie    integer primary key references movie (id),
    duration text,
    price    integer
)

И мой код выглядит так

@Query("select * from movie where title = :title ")
fun findByTitle(@Param("title") title: String): List<Movie>

Но есть исключение org .springframework.data.mapping.MappingException: Не удалось прочитать значение rental_mov ie из набора результатов!

Пример проекта GitHub .

PS Я довольно новичок в этом и следовал этому видео , чтобы изучить основы, пожалуйста, помогите мне сделать это правильно

Solution # 1

Используйте @ Query , как это, но все же не так хорошо, так как внутри второй таблицы может быть много столбцов

SELECT movie.*,
       rental.price    AS rental_price,
       rental.duration AS rental_duration,
       rental.movie    AS rental_movie
FROM movie
         LEFT OUTER JOIN rental ON rental.movie = movie.id
where movie.title = 'Matrix'

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Ваше решение №1 в настоящее время является правильным способом сделать это.

Запрос должен возвращать столбцы для всех простых свойств совокупности root и для всех встроенных или ссылочных объектов.

Если вы не хотите этого делать, вы всегда можете указать свои RowMapper или ResultSetExtractor

Давайте предположим, что следующие классы (аналогичные у вас, вероятно, есть):

class Movie {

    @Id Long id;
    String title;

    @Embedded
    Actor with;

    Rental rental;
}

class Actor {
    String name;
}

class Rental {
    Integer price;
}

Ваш выбор должен вернуть следующие столбцы:

  1. id для свойства id Movie

  2. title для свойства title Movie

  3. rental_price для свойства price Rental. Обратите внимание на префикс rental comes from the property name Rental not from the class name Rental`.

  4. rental_movie Этот столбец является искусственным идентификатором для Rental, используемым для определения, существует ли вообще Rental или если Movie.rental равно null. Значение не имеет значения, за исключением того факта, что оно равно null или нет. Этот столбец не требуется, если Rental имеет столбец идентификатора.

  5. name для свойства name класса Actor.

    Примечание: Здесь нет префикса. Если вам нужен префикс, например, потому что класс встраивается несколько раз, вы должны поместить его в аннотацию @Embedded.

    _Note # 1: Здесь нет искусственного идентификатора. Для встроенных классов есть атрибут onEmpty аннотации @Embedded, чтобы контролировать, когда все свойства имеют значение null, если весь встроенный класс равен null или если экземпляр встроенного класса создается со всеми свойствами, установленными на null.

С Spring Data JDB C 1.xa отсутствующий столбец вызывает исключение, как вы видели.

Начиная с версии 2.0 пропущенный столбец будет игнорироваться, а свойство не установлено.

Существует проблема, заключающаяся в том, чтобы предоставить более простой способ определения, просто задав условие where: https://jira.spring.io/browse/DATAJDBC-225

0 голосов
/ 01 мая 2020
data class Movie(
        @Id
        val id: Long?,
        val title: String,
        val description: String,
        val rental: Rental
)

Я не использую Kotlin, но я думаю, что если вы хотите запросить Mov ie и Rental вместе, вы должны использовать аннотацию @OneToOne. Что-то вроде (java):

public class Movie {
@OneToOne(mappedBy = "moive", cascade = CascadeType.ALL,
              fetch = FetchType.LAZY, optional = false)
private Rental rental;
}

И ваш класс Арендной платы не правильный, нужно movieId.

public class Rental {

   ...
   @OneToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "movie_id")
   private Movie movie;

}

Вы можете проверить пример кода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...