Hibernate:从一到多查找实体 table

Hibernate: Find entity from one to many table

我有两个table

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`)
);

而hibernate中的对象是

@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
}

如您所见,我的英雄 class 没有提到英雄品质,我想保持这种状态。

我也有一个仓库

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

    List<HeroicQuality> findByOrderByIdDesc();
}

我想做的是有一个方法,例如

Optional<HeroicQuality> findByHeroName(String heroName)

这样如果给英雄一个英雄的名字table我就能得到英雄品质的对象

如何制作这样的方法? 有没有什么方法可以在不在英雄对象中引用它的情况下获得英雄品质的对象? 我该怎么做呢?

将以下方法添加到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);