请建议自定义 findBy 或查询
Please, suggest custom findBy or query
我需要通过多个参数进行搜索,但如果其中一些是 null
,则在搜索时不要考虑它们。
例如,我想找到一个在美国并在 Google 工作的人,但现在我的搜索已实现,因此所有现在在美国或目前正在 Google 工作的人].如果我使用 and 而不是 or,将使用 null
.
搜索字段
现在我的搜索看起来像这样并得到一组输入 - 第二个问题由此产生。 如何将此集合与此实体的 OneToMany table 进行比较?
Long<Game> findByGameTitleOrGameTypeOrGameLocations(String title, String type, Set<String> locations);
这是来自实体的一组位置:
@ElementCollection
private Set<String> gameLocations;
这些问题对某些人来说可能看起来很愚蠢 xD 但我是新手。
我可以通过@Query 注释建议自定义查询请求。我不确定这是最佳方式,但它确实有效。
@Query("SELECT g FROM Game g" +
" WHERE (:title is null or g.title = :title)" +
" AND (:type is null or g.type = :type)" +
" AND (:locations is null or g.locations in :locations)")
Long<Game> findByGameTitleOrGameTypeOrGameLocations(
@Param("title") String title,
@Param("type") String type,
@Param("locations") Set<String> locations);
这是一个请求的例子,因为我不知道你的数据库型号。
why cant you go with preparing the query as below.
@Query(value = "select * from game ga where ga.tile=:#{#title} and ga.type=:#{#type} and ga.location in (:#{#locationList})", nativeQuery = true)
Object[] findByGameTitleOrGameTypeOrGameLocations(@Param("title") String title,@Param("type") String type,@Param("location") List<String> locationList);
我需要通过多个参数进行搜索,但如果其中一些是 null
,则在搜索时不要考虑它们。
例如,我想找到一个在美国并在 Google 工作的人,但现在我的搜索已实现,因此所有现在在美国或目前正在 Google 工作的人].如果我使用 and 而不是 or,将使用 null
.
现在我的搜索看起来像这样并得到一组输入 - 第二个问题由此产生。 如何将此集合与此实体的 OneToMany table 进行比较?
Long<Game> findByGameTitleOrGameTypeOrGameLocations(String title, String type, Set<String> locations);
这是来自实体的一组位置:
@ElementCollection
private Set<String> gameLocations;
这些问题对某些人来说可能看起来很愚蠢 xD 但我是新手。
我可以通过@Query 注释建议自定义查询请求。我不确定这是最佳方式,但它确实有效。
@Query("SELECT g FROM Game g" +
" WHERE (:title is null or g.title = :title)" +
" AND (:type is null or g.type = :type)" +
" AND (:locations is null or g.locations in :locations)")
Long<Game> findByGameTitleOrGameTypeOrGameLocations(
@Param("title") String title,
@Param("type") String type,
@Param("locations") Set<String> locations);
这是一个请求的例子,因为我不知道你的数据库型号。
why cant you go with preparing the query as below.
@Query(value = "select * from game ga where ga.tile=:#{#title} and ga.type=:#{#type} and ga.location in (:#{#locationList})", nativeQuery = true)
Object[] findByGameTitleOrGameTypeOrGameLocations(@Param("title") String title,@Param("type") String type,@Param("location") List<String> locationList);