问题描述
我正在尝试在Spring Data REST应用程序中使用queryDSL。我无法使其正常工作,因此我编写了可以轻松使用并看到相同结果的测试应用程序:除第一个搜索参数外的所有内容均被忽略。我的问题似乎是Multi-column "OR" in Spring Data Rest with QueryDsl的一个副本,尚未得到解答。我正在使用Spring生成的REST控制器,并希望避免创建自定义控制器。我唯一需要的queryDSL定制是对所有为字符串的数据库字段使用不区分大小写的“ LIKE”,而不是完全匹配字符串。我的代码很简单。
实体:
@Data
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String email;
}
存储库:
@RepositoryRestResource(collectionResourceRel = "user",path = "user")
public interface UserRepository extends JpaRepository<User,Integer>,QuerydslPredicateExecutor<User>,QuerydslBinderCustomizer<QUser> {
@Override
default void customize(QuerydslBindings bindings,QUser root) {
// use case-insensitive contains instead of exact match for all string values
bindings.bind(String.class).all(new MultiValueBinding<StringPath,String> () {
@Override
public Optional<Predicate> bind(StringPath path,Collection<? extends String> values) {
BooleanBuilder predicate = new BooleanBuilder();
values.forEach( value -> predicate.and(path.containsIgnoreCase(value)));
return Optional.of(predicate);
}
});
}
当我执行curl请求时:
curl -i http://localhost:8080/user?firstName=john&lastName=foo
即使数据库中不存在“ john foo”(但“ john doe”也存在),我也得到了一个条目。当我查看生成的Hibernate查询时,我看到正在使用我的queryDSL自定义,但是查询只有一个参数:
select user0_.id as id1_0_,user0_.email as email2_0_,user0_.first_name as first_na3_0_,user0_.last_name as last_nam4_0_ from users user0_ where lower(user0_.first_name) like ? escape '!' limit ?
要使用灵活的多参数查询(搜索名字和姓氏,或按姓氏和电子邮件),我应该添加什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)