java - 如何使用 Spring 和 JPA 获取具有多个参数的实体
问题描述
假设我有一个网站,用户可以在该网站上选择多种参数。
我可以用SQL写出我需要的东西,但问题是可能有很多OR(很多多值参数):
SELECT * FROM vacancy JOIN types t on vacancy.id = t.id
WHERE (company ='Luxoft' OR company LIKE '%SoftServe%' OR...)
AND (location LIKE 'Kiev' OR location LIKE 'Lviv' OR..)
AND (type like 'Java' OR type like 'JavaScript' OR..)
现在我正在通过从我的数据库中获取所有空缺,遍历所有空缺,保存那些包含所需 TITLE 的空缺,然后我从这个新保存的空缺中迭代并找到那些具有所需公司参数之一的空缺,位置参数类型参数。
但是因为现在我有多种类型的空缺,这些空缺被映射到空缺数据库,@ElementCollection
并且@CollectionTable
类型的获取变得非常慢。
我想到了 Spring ExampleMatcher,但我不确定它是否可以做到这一点。
谢谢。
解决方案
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<EntityName> c = cb.createQuery(EntityName.class);
Root<EntityName> root = c.from(EntityName.class);
Predicate company = cb.or (
cb.equal(root.<String>get("company"), "Luxoft"),
cb.like(root.<String>get("name"), "%SoftServe%"));
Predicate location = cb.or (
cb.equal(root.<String>get("location"), "Kiev"),
cb.like(root.<String>get("location"), "%Lviv%"));
Expression<String> typeExpression = root.get("type");
Predicate type = typeExpression.in("Java", "Javascript");
c.where(company, location, type);
return c.getResultList();
CriteriaBuilder
Hibernate和CriteriaQuery
类将帮助您使用代码创建此类查询。
推荐阅读
- html - CSS 不会在 IE11 上呈现
- javascript - JS:在“。”之后在命令中使用更改字符串
- angular6 - 应用程序找不到 .js 文件
- r - 循环配对 data.frame 列以在 R 中进行 t.test
- reactjs - Laravel 5.4 和反应
- database - 创建我自己的个人资金跟踪应用程序的最佳工具是什么?
- visual-studio-code - 如何在 Visual Studio Code 的快速打开视图中设置默认选项?
- c++ - 如何将整数列表添加到 sqlite3 的表中
- mysql - 将数据存储到 mysql 时出现错误
- r - 在 RStudio 中,如何制作列数据与行号匹配并被 1 替换,其余被 0 替换的数据矩阵?