java – Spring JPA Repository动态查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring JPA Repository动态查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2693字,纯文字阅读大概需要4分钟。
内容图文
![java – Spring JPA Repository动态查询](/upload/InfoBanner/zyjiaocheng/710/34c52a17f8e24520b01a91629d6bf56f.jpg)
目前我一直在使用以下Spring JPA Repository基础自定义查询,它工作正常,
@Query("SELECT usr FROM User usr WHERE usr.configurable = TRUE "
+ "AND (" +
"lower(usr.name) like lower(:filterText) OR lower(usr.userType.classType.displayName) like lower(:filterText) OR lower(usr.userType.model) like lower(:filterText)"
+ ")"
+ "")
public List<User> findByFilterText(@Param("filterText") String filterText, Sort sort);
当过滤器文本将成为逗号分隔值时,我需要修改此查询.但是按照以下方式,它将是一个动态查询,我该如何执行它.
我需要构建动态查询,
String sql = "SELECT usr FROM User usr WHERE usr.configurable = TRUE";
for(String word : filterText.split(",")) {
sql += " AND (lower(usr.name) like lower(:" + word + ") OR lower(usr.userType.classType.displayName) like lower(:" + word + ") OR lower(usr.userType.model) like lower(:" + word + "))";
}
解决方法:
根据JB Nizet和spring-data documentation,您应该使用自定义接口存储库实现.
使用方法创建接口:
public interface MyEntityRepositoryCustom {
List<User> findByFilterText(Set<String> words);
}
创建一个实现:
@Repository
public class MyEntityRepositoryImpl implements MyEntityRepositoryCustom {
@PersistenceContext
private EntityManager entityManager;
public List<User> findByFilterText(Set<String> words) {
// implementation below
}
}
扩展现有Repository接口中的新接口:
public interface MyEntityRepository extends JpaRepository<MyEntity, Long>, MyEntityRepositoryCustom {
// other query methods
}
最后,在其他地方调用该方法:
dao.findByFilterText(new HashSet<String>(Arrays.asList(filterText.split(","))));
查询实现
生成sql变量的方法,即将一些字符串连接到查询中是不好的.不要这样做.
你连接的单词必须是valid JPQL identifier,即a:后跟java identifier start,可选后跟一些java identifier part.这意味着如果你的CSV包含foo bar,baz,你将尝试使用foo bar作为标识符,你’我会得到一个例外.
您可以使用CriteriaBuilder以安全的方式构造查询:
public List<User> findByFilterText(Set<String> words) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> q = cb.createQuery(User.class);
Root<User> user = q.from(User.class);
Path<String> namePath = user.get("name");
Path<String> userTypeClassTypeDisplayName =
user.get("userType").get("classType").get("displayName");
Path<String> userTypeModel = user.get("userType").get("model");
List<Predicate> predicates = new ArrayList<>();
for(String word : words) {
Expression<String> wordLiteral = cb.literal(word);
predicates.add(
cb.or(
cb.like(cb.lower(namePath), cb.lower(wordLiteral)),
cb.like(cb.lower(userTypeClassTypeDisplayName),
cb.lower(wordLiteral)),
cb.like(cb.lower(userTypeModel), cb.lower(wordLiteral))
)
);
}
q.select(doc).where(
cb.and(predicates.toArray(new Predicate[predicates.size()]))
);
return entityManager.createQuery(q).getResultList();
}
内容总结
以上是互联网集市为您收集整理的java – Spring JPA Repository动态查询全部内容,希望文章能够帮你解决java – Spring JPA Repository动态查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。