Spring Boot JPA 通过关联表进行过滤

5

我在文档(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)中找不到具体信息,并且在多个博客中也没有找到满意的答案,所以我有一个问题。

我有一个名为Entity的表:

@Entity
@Table(name = "workstation")
public class Workstation
{
 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "userid", nullable = false)
 public User user;
}

并且用户表实体:

public class user
{
 @Id
 @GeneratedValue(strategy = IDENTITY)
 @Column(name = "ID", unique = true, nullable = false)
 public Integer id;

 @Column(name = "age", nullable = false)
 public int age
}

现在我想要在我的代码库中运行以下这样的查询:
public interface WorkstationRepo extends CrudRepository<Workstation, Long> {
 findByUserAgeLesserThan(int maxAge);
}

我希望通过我的工作站实体找到所有年龄在一定范围内的用户。
是否可以不使用@Query注解来完成?如果可以,应该怎么编写?
3个回答

5

试试这个

List<Workstation> findByUserAgeLessThan(int maxAge);

或者您还可以编写自己的查询

@Query("Select w from Workstation w where w.user.age < :maxAge")
List<Workstation> findByUserAgeLesserThan(@Param("maxAge") int maxAge);

好的,第一个选项效果不太好。它会使问题变得更加复杂。例如,如果我们使用"AllUsers"和"TrueAge",Spring就无法查找它们。 - Gregor Sklorz
1
第一种选择有什么问题吗?我在本地测试过,效果还不错。 - Abdullah Khan
是的,当涉及到稍微复杂的查询时,查询方法名称会变得非常复杂和冗长。目前最好的选择是使用@Query() - Abdullah Khan
是的! 它对简洁的小名称效果很好,但对于更多的驼峰命名,它以一种奇怪的方式进行转换。 如果我有更好的文档,我会直接使用它 :) 我喜欢那个Spring JPA!尽管它有点“hacky” :) - Gregor Sklorz

2

这个可以工作:

@Query("SELECT w from Workstation w INNER JOIN w.user u where u.age < ?1")
List<Workstation> findByUserAgeLessThan(int age);

1
你应该有类似这样的内容:
@Query("SELECT w from Workstation w INNER JOIN w.user u where u.age < :age")
List<Workstation> findByUserAgeLessThan(@Param("age") int age);

基本上,您需要使用JPQL连接表格。

谢谢!目前来看,手动使用查询似乎是最明显的选择 :) - Gregor Sklorz
但是 @Param 似乎已经过时了...所以在查询中使用 "?1" 来代替第一个变量会更好。 - Gregor Sklorz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接