Репозиторий Hibernate для многих не может найти более старые записи - PullRequest
1 голос
/ 14 июля 2020

У меня есть две таблицы

CREATE TABLE `heroic_quality`
(
    `id`   INT          NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(515) NOT NULL UNIQUE,
    PRIMARY KEY (`id`)
);

CREATE TABLE `hero`
(
    `id`         INT            NOT NULL AUTO_INCREMENT,
    `name`       VARCHAR(515)   NOT NULL UNIQUE,
    `quality_id` INT            DEFAULT NULL,
    FOREIGN KEY  (`quality_id`) REFERENCES heroic_quality (id),
    PRIMARY KEY  (`id`)
);

И объекты в спящем режиме:

@Table(name = "heroic_quality")
@Entity(name = "heroic_quality")
public class HeroicQuality
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    protected long id;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "id")
    @Fetch(FetchMode.SELECT)
    private List<Hero> heroes;

    //ommited getters and setters for shortness
}


@Table(name = "hero")
@Entity(name = "hero")
public class Hero
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    protected long id;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    //ommited getters and setters for shortness
}

Обратите внимание, что я не хочу иметь ссылку на HeroicQuality в моем объекте Hero.

У меня также есть репозиторий

@Repository
public interface HeroicQualityDAO
        extends PagingAndSortingRepository<HeroicQuality, Long>
{
    Optional<HeroicQuality> findByHeroesName(String heroName);
}

Моя база данных содержит следующие данные.

Данные в моей базе данных

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вызываю findByHeroesName, если параметр Joan of Arc, то isPresent() возвращает true. Однако, если параметр равен Queen Boudica или Barbos, то isPresent() ложно, и я не могу получить качественный объект.

Почему это происходит и как это исправить?

Код, который я выполняю каждый раз, -

    Optional<HeroicQuality> foundquality = qualities.findByHeroesName(hero.getName());
    if (foundquality.isPresent())
    {
        log.info(foundquality.get().toString());
    }
    else
    {
        log.info("Quality not found");
    }

И я получу данные только для Joan of Arc. Я не понимаю, почему это происходит ...

1 Ответ

1 голос
/ 14 июля 2020

Поскольку JPA не сгенерировал схему базы данных из вашей модели сущности, правильный запрос не может быть создан.

Если вы посмотрите на созданный запрос:

select heroicqual0_.id as id1_2_, heroicqual0_.name as name2_2_ from heroic_quality heroicqual0_ left outer join hero heroes1_ on heroicqual0_.id=heroes1_.id where heroes1_.name=?

heroicqual0_.id=heroes1_.id эта часть вызывает проблему. Единственными записями, имеющими одинаковое значение в столбцах id обеих таблиц, являются (4, 'God Visions') и (4, ‘Joan of Arc’, 4)

Соединение должно было быть таким: heroic_quality.id = hero.quality_id

Вы можете написать запрос, чтобы получить желаемый результат:

@Repository
public interface HeroicQualityDAO extends PagingAndSortingRepository<HeroicQuality, Long>
{
    @Query(value="select * from heroic_quality q join hero h on q.id=h.quality_id where h.name=:name", nativeQuery = true)
    Optional<HeroicQuality> findByHeroesName(@Param("name") String heroName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...