Hibernate: найти объект от одной до многих таблиц - PullRequest
1 голос
/ 13 июля 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
}

Как вы видите, мой класс Hero не имеет ссылки на качество heroi c и Я хотел бы сохранить его таким.

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

@Repository
public interface HeroicQualityDAO
        extends PagingAndSortingRepository<HeroicQuality, Long>
{
    Optional<HeroicQuality> findByName(String name);

    List<HeroicQuality> findByOrderByIdDesc();
}

Я бы хотел иметь такой метод, как

Optional<HeroicQuality> findByHeroName(String heroName)

Таким образом, если указать имя героя из таблицы героев, я смогу получить объект качества heroi c.

Как я могу сделать такой метод? Есть ли способ получить объект качества heroi c без ссылки на него в объекте hero? Как я могу go это сделать?

1 Ответ

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

Добавьте следующий метод в HeroicQualityDAO.

   Optional<HeroicQuality> findByHeroesName(String heroName);

Если вас не устраивает имя метода, вы можете сделать

    @Query("Select h from HeroicQuality hq join hq.heros h where h.name = :name")
    Optional<HeroicQuality> findByHeroName(String name);
...