【问题标题】:Hibernate JPA select with parameter and multiple LIKE [duplicate]Hibernate JPA选择带有参数和多个LIKE [重复]
【发布时间】:2019-02-19 11:56:00
【问题描述】:

我正在尝试制作一个小型 Spring Boot 服务,它接收一个参数,然后查询将对句子中的每个单词应用一个赞。我想知道为什么会这样:

    @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% or p.NombreCompletoFonetico like %ARLNS%”

它应该给出与上面测试相同的结果,所以我想知道为什么它不同。

【问题讨论】:

  • 所以去看看实际调用的 SQL(在 JPA 提供程序日志中),你会更好地理解

标签: java sql hibernate spring-boot jpa


【解决方案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());
    }
}

【讨论】:

  • 非常感谢您向我解释这一点,这正是我需要知道的,感谢您花时间改进我的代码。
  • :D 随时欢迎您。
猜你喜欢
  • 2018-05-02
  • 2018-04-27
  • 2020-07-27
  • 2014-11-19
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多