findBy не работает с унаследованными свойствами - PullRequest
0 голосов
/ 18 июня 2019

У меня есть следующая модель и хранилище:

@Entity
@Table(name = "db_user", uniqueConstraints = { @UniqueConstraint(columnNames = "email") })
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_user")
    @SequenceGenerator(name = "seq_user", sequenceName = "seq_user")
    @Column(name = "id")
    private Long id;

    // ...
}

@Entity
@Table(name = "movie")
public class Movie extends AbstractItem {
    // Id column inherited from AbstractItem

    // ...
}

@Entity
@Table(name = "movie_user")
public class MovieOwnership extends AbstractOwnership {

    @ManyToOne
    private Movie movie;

    // ...
}

@MappedSuperclass
public abstract class AbstractOwnership{

    @Id
    @SequenceGenerator(name = "seq_default", sequenceName = "seq_default")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_default")
    @Column(name = "id")
    private Long id;

    @ManyToOne
    private User owner;

    // ...
}


public interface MovieOwnershipRepository extends QueryDslJpaRepository<MovieOwnership, Long> {

    List<MovieOwnership> findByOwnerId(Long ownerId);

    MovieOwnership findByOwnerIdAndMovie(Long ownerId, Movie movieId);

    List<MovieOwnership> findByOwnerIdAndMovieIdIn(Long ownerId, Set<Long> movieIds);
}

Я пытаюсь использовать запросы SpringByindBy для извлечения MovieOwnerships по владельцу или фильму, используя поле id обеих сущностей. Я могу работать напрямую с идентификатором владельца, но использование MovieId в моих запросах кажется некорректным (хотя я могу использовать весь объект Movie). В приведенном выше коде первые два findBy в порядке, но последний выдает это исключение:

Причина: java.lang.IllegalArgumentException: невозможно найти Атрибут с указанным именем [movieId] для этого ManagedType [Carrm.app.data.AbstractOwnership]

Он компилируется, если я пытаюсь использовать другое свойство из Movie (например, findByMovieTitle), но не могу заставить его работать с идентификатором.

Есть идеи, как это решить?

1 Ответ

0 голосов
/ 19 июня 2019

Я попробовал то же самое с JpaRepository вместо QueryDslJpaRepository.

SQL генерируется правильно:

select movieowner0_.id as id1_1_, movieowner0_.owner_id as owner_id2_1_, movieowner0_.movie_id as movie_id3_1_ 
from movie_ownership movieowner0_ 
left outer join user user1_ on movieowner0_.owner_id=user1_.id 
left outer join movie movie2_ on movieowner0_.movie_id=movie2_.id 
where user1_.id=? and (movie2_.id in (?))

Так что это должна быть ошибка реализации QueryDslJpaRepository.

Я бы посоветовал вам использовать JpaRepository.

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