Database Hibernate一对多存储库找不到较旧的条目
我有两张桌子Database Hibernate一对多存储库找不到较旧的条目,database,spring-boot,hibernate,h2,Database,Spring Boot,Hibernate,H2,我有两张桌子 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`
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
}
我只会得到圣女贞德的数据。
我不知道为什么会发生这种情况……因为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=?
HeroQual0_u0.id=heroes1_u0.id此部分导致问题。两个表中id列上唯一具有相同值的记录是4个“上帝幻象”和4个“圣女贞德”
连接应该是这样的:herome\u quality.id=hero.quality\u 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);
}
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=?
@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);
}