开发者社区 问答 正文

Spring存储库findBy连接表

我有以下型号

游戏模型

// ...

@ManyToMany(cascade = CascadeType.DETACH)
@JoinTable(
    name = "game_genre",
    joinColumns = { @JoinColumn(name = "game_id") },
    inverseJoinColumns = { @JoinColumn(name = "genre_id") } )
private List<GenreModel> genres;

// ...

类型模型

// ...

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "name", nullable = false, unique = true, length = 50)
private String name;

@ManyToMany(mappedBy = "genres")
private List<GameModel> games;

// ...

另外,我有他们的存储库。 如何获得属于(例如) 流派 ID为1的所有游戏?在GameModel中,我没有流派列,因此无法在GameRepository中使用findByGenresContaining 做到这一点。

展开
收起
垚tutu 2019-11-28 18:22:25 626 分享 版权
阿里云 AI 助理回答

在Java Spring框架中,使用JPA(Java Persistence API)进行数据库操作时,你遇到的情况是需要通过关联关系查询数据。既然GameModel实体类中没有直接包含Genre的属性,而是通过中间表game_genre建立了多对多关系,你可以利用Spring Data JPA提供的方法命名规则来创建自定义查询。

要在GameRepository中获取流派ID为1的所有游戏,你可以定义一个方法,该方法的名称遵循Spring Data JPA的查询生成规则。这里,你需要一个方法来根据Genre的ID查找所有关联的游戏,尽管直接使用findByGenresContaining不可行,但你可以使用@Query注解来自定义SQL或者HQL查询语句。

下面是一个示例,展示了如何在GameRepository接口中添加这个查询:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface GameRepository extends CrudRepository<GameModel, Integer> {

    @Query("SELECT gm FROM GameModel gm JOIN gm.genres g WHERE g.id = :genreId")
    List<GameModel> findByGenreId(@Param("genreId") int genreId);
}

在这个例子中,我们使用了HQL(Hibernate Query Language)来编写查询。JOIN gm.genres g部分表示从GameModel实体出发,通过其genres集合属性连接到Genre实体,并且我们在WHERE子句中指定了g.id = :genreId来过滤出流派ID为指定值的游戏。

这样,当你调用gameRepository.findByGenreId(1)时,它将返回所有属于流派ID为1的游戏列表。记得在实际应用中导入必要的依赖和使用正确的包名。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答