Hibernate JPA select с параметром и несколькими LIKE

Я пытаюсь создать небольшую службу загрузки 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, который действительно был вызван (в журнале провайдеров JPA), и вы поймете лучше

user3973283 14.09.2018 18:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы не можете использовать указанный параметр для добавления 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());
    }
}

Большое спасибо за то, что объяснили мне это. Это именно то, что мне нужно было знать, и я ценю, что вы нашли время, чтобы улучшить мой код.

Flavio Alarcon 14.09.2018 19:27

: D В любое время добро пожаловать.

lscoughlin 17.09.2018 19:38

Другие вопросы по теме