Spring数据存储库按字段查找字段的方法

我有两个实体,一个是用户,一个是注册用户。

注册用户具有用户类型的字段。我希望在与此注册用户实体相关的spring数据存储库中有一种方法,通过连接到注册用户的用户的用户名搜索所有注册用户。

因此,这是具有关联用户字段的注册用户实体:

@Entity
public class RegisteredUser implements Serializable {

    ... 
    @OneToOne
    @JoinColumn(name = "USERNAME_FK")
    private User user;
    ...
}

这是一个用户名的用户:

@Entity
public class User implements Serializable { 
    ...
    @Id
    @Column(nullable = false)
    protected String username;
    ...
}

答案 1

Spring Data(至少 1.12.x 版本)使用 PropertyPath#from 方法提取从方法名称构造的谓词的属性路径。根据消息来源,它使用下划线作为“字段分隔符”。所以第一个变体如下

public interface RegisteredUserRepository extends CrudRepository<RegisteredUser,String> {
    List<RegisteredUser> findRegisteredUserByUser_Username(String username);
}

还有一些代码在找不到整个字段名称时将大写字符视为字段分隔符。因此,如果您在第二个瓦里安中没有字段,则userUsernameRegisteredUser

public interface RegisteredUserRepository extends CrudRepository<RegisteredUser,String> {
    List<RegisteredUser> findRegisteredUserByUserUsername(String username);
}

答案 2

您也可以简单地使用像这样的库,它允许您构建动态过滤器(支持逻辑运算符,比较器,枚举,日期,布尔值,连接,函数等等):https://github.com/turkraft/spring-filter

您不必创建任何存储库接口,并且能够直接在客户端应用程序中使用提供的查询生成器。

示例查询:

/search?filter= 平均(评级)> 4.5 brand.name“奥迪”、“路虎”)(2018 年>年或公里 < 50000)和颜色“白色”事故为空

用法:

@GetMapping(value = "/search")
public List<Entity> search(@EntityFilter Specification<Entity> spec, Pageable page) {
  return repo.findAll(spec, page);
}

不要忘记依赖关系:

<dependency>
    <groupId>com.turkraft</groupId>
    <artifactId>spring-filter</artifactId>
    <version>0.9.5</version>
</dependency>

你也可以检查rsql,尽管它现在有点过时了 https://github.com/jirutka/rsql-parser


推荐