【问题标题】:Hibernate one to many repository can't find older entries休眠一对多存储库找不到旧条目
【发布时间】:2020-07-14 13:59:46
【问题描述】:

我有两张桌子

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
}

请注意,我不想在我的 Hero 对象中引用 HeroicQuality。

我也有一个仓库

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

我的数据库有以下数据。

我遇到的问题是每当我调用findByHeroesName 时,如果参数是Joan of Arc,那么isPresent() 就会返回true。但是如果参数是Queen BoudicaBarbos 那么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 的数据。 我不知道为什么会这样......

【问题讨论】:

    标签: database spring-boot hibernate h2


    【解决方案1】:

    由于 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多