То, что я хочу сделать как собственный запрос, будет выглядеть примерно так:
SELECT * FROM table WHERE col1 LIKE '%param1%' AND col1 LIKE '%param2%';
Но дело в том, что я могу получить 1..N params, как бы мне этого добиться?
@Entity
@Table(name = "random")
public class Random implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotEmpty
@Column(nullable = false)
private String col1;
}
public interface IRandomDAO extends JpaRepository<Random, Long>{
public List<Random> findByCol1Containing(String params);
}
public interface IRandomService {
public List<Random> findByCol1Containing(Set<String> params);
}
@Service
public class RandomServiceImpl implements IRecetaService {
@Autowired
private IRecetaDAO recetaDAO;
@Override
public List<Random> findByCol1In(Set<String> params) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Random> query = cb.createQuery(Random.class);
Root<Random> random= query.from(Random.class);
Path<String> paramsPath = random.get("col1");
List<Predicate> predicates = new ArrayList<>();
for (String param: params) {
predicates.add(cb.like(paramsPath , param));
}
query.select(random)
.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(query)
.getResultList();
}
}
@CrossOrigin(origins = { "http://localhost:4200" })
@RestController
@RequestMapping("/rest")
public class RandomRestController {
@Autowired
private IRandomService randomService;
@GetMapping("/random")
public ResponseEntity<?> find(@RequestParam String params) {
String[] search = null;
Set<String> searchParams = new HashSet<>();
if (params.contains("-")) {
search = params.split("-");
for (int i = 0; i < search.length; i++) {
// filling the set with any number of items
searchParams.add("%" + search[i] + "%");
}
} else {
searchParams.add("%" + params + "%");
}
Map<String, Object> response = new HashMap<>();
List<Random> listRandom = null;
listRandom = randomService.findByCol1In(searchParams);
if (!listRandom.isEmpty()) {
response.put("mensaje", "found it");
response.put("receta", listRandom);
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.OK);
}
response.put("message", "not found");
response.put("word", searchParams.toString());
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.OK);
}
}
Так что проблема в том, что с этим кодом я получаю результат запроса, подобный:
SELECT * FROM table WHERE col1 LIKE '%param1%';
SELECT * FROM table WHERE col1 LIKE '%param2%';
SELECT * FROM table WHERE col1 LIKE ...N params;
Как мне достичь:
SELECT * FROM table WHERE col1 LIKE '%param1%' AND col1 LIKE '%param2%' AND col1 LIKE '%Nparams%';
Если я что-то не так с вопросом, прошу прощения, это мой первый пост.
Заранее спасибо!