我有以下型号
游戏模型
// ...
@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 做到这一点。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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的游戏列表。记得在实际应用中导入必要的依赖和使用正确的包名。