Hibernate:从一个到多个表中查找实体

Posted

技术标签:

【中文标题】Hibernate:从一个到多个表中查找实体【英文标题】:Hibernate: Find entity from one to many table 【发布时间】:2020-07-13 14:49:42 【问题描述】:

我有两张桌子

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

正如你所见,我的英雄职业没有提到英雄品质,我想保持这种风格。

我也有一个仓库

@Repository
public interface HeroicQualityDAO
        extends PagingAndSortingRepository<HeroicQuality, Long>

    Optional<HeroicQuality> findByName(String name);

    List<HeroicQuality> findByOrderByIdDesc();

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

Optional<HeroicQuality> findByHeroName(String heroName)

这样,如果从英雄表中给出一个英雄的名字,我将能够获得英雄品质的对象。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Hibernate:从一个到多个表中查找实体的主要内容,如果未能解决你的问题,请参考以下文章

hibernate使用setResultTransformer()将SQL查询结果放入集合中

如何将多个值类型集合映射到 Hibernate 中的一个表?

Struts2+EasyUI+Hibernate小实例

Hibernate - 第一个 Sql 插入需要很长时间

Hibernate映射

Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib