Я пытаюсь создать небольшую службу загрузки Spring, которая получает параметр, а затем запрос будет применять лайк к каждому слову в предложении. Я хочу знать, почему это работает:
@GetMapping("/getAll")
//@CrossOrigin(origins = "http://localhost:4200")
private List<PersonaNegativa> getAll(){
List<PersonaNegativa> listneg = new ArrayList<PersonaNegativa>();
try {
listneg = entityManager
.createQuery("select p from PersonaNegativa p where p.NombreCompletoFonetico like '%ARKRP%' "
+ "or p.NombreCompletoFonetico like '%ARLNS%'",
PersonaNegativa.class).getResultList();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return listneg;
}
Но это не так.
@GetMapping("/getNombre/{nom}")
private List<PersonaNegativa> getByNombre(@PathVariable String nom){
DoubleMetaphone dm = new DoubleMetaphone();
dm.setMaxCodeLen(5);
String[] nomarray = nom.split(" ");
String nomconvertido = "";
for(int i = 0; i<=nomarray.length-1; i++) {
if (i< nomarray.length-1) {
nomconvertido += "%" + dm.doubleMetaphone(nomarray[i])+ "% or p.NombreCompletoFonetico like ";
}
else {
nomconvertido += "%" +dm.doubleMetaphone(nomarray[i]) + "%";
}
}
System.out.println(nomconvertido);
List<PersonaNegativa> listneg = new ArrayList<PersonaNegativa>();
try {
listneg = entityManager
.createQuery("select p from PersonaNegativa p where p.NombreCompletoFonetico like :nom",
PersonaNegativa.class)
.setParameter("nom", nomconvertido).getResultList();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return listneg;
}
}
при печати 'nomconvertido' я получаю следующее: "% ARKRP% или p.NombreCompletoFonetico как% ARLNS%"
который должен дать тот же результат, что и тест выше, поэтому мне интересно, почему он отличается.




Поскольку вы не можете использовать указанный параметр для добавления sql. Вы передаете весь набор похожих элементов в качестве значения, поэтому вам нужно создать JPQL так же, как и в первом случае.
Я добавил несколько примеров кода, которые я абсолютно не тестировал, чтобы вы двигались в правильном направлении.
@GetMapping("/getNombre/{nom}")
private List<PersonaNegativa> getByNombre(@PathVariable String nom) {
DoubleMetaphone dm = new DoubleMetaphone();
dm.setMaxCodeLen(5);
int parameterCount = 0;
StringBuilder clause = new StringBuilder();
List<String> parameters = new ArrayList<>();
for (String string : nom.split(" ")) {
clause.append((clause.length() == 0) ? " p.NombreCompletoFonetico like ?" : " or p.NombreCompletoFonetico like ?");
parameters.add("%" + dm.doubleMetaphone(string));
}
String jpaql = "select p from PersonaNegativa p where " + clause.toString();
List<PersonaNegativa> listneg = new ArrayList<PersonaNegativa>();
try {
TypedQuery<PersonaNegativa> query = entityManager
.createQuery(jpaql,
PersonaNegativa.class);
for (int i = 0; i < parameters.size(); i++) {
query.setParameter(i, parameters.get(i))
}
return query.getResultList();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
Большое спасибо за то, что объяснили мне это. Это именно то, что мне нужно было знать, и я ценю, что вы нашли время, чтобы улучшить мой код.
: D В любое время добро пожаловать.
Так что пойдите и посмотрите на SQL, который действительно был вызван (в журнале провайдеров JPA), и вы поймете лучше