【问题标题】:How should I pass values into JPQL query?我应该如何将值传递给 JPQL 查询?
【发布时间】:2019-01-22 14:07:24
【问题描述】:

我正在进行测试,它将检查对象是否已保存到数据库中。测试将保存具有唯一值的对象,然后我想从数据库中获取该对象并检查它是否不为空。 Id 是自动生成的,所以我需要按名称查找此对象。

我的测试如下所示:

@Test
public void shouldAddNewEmployee(){

    String firstNameTest = "Jon";
    String lastNameTest = "Doe";
    double salary1test = 10.0;
    String salary2test = "10.00";
    String localityTest = "LosAngeles";
    String zipCodeTest = "00-000";
    String streetTest = "LosAngeles str.";
    int streetNumberTest = 10;

    Employee testEmployee = new Employee(
            firstNameTest,
            lastNameTest,
            salary1test,
            salary2test,
            localityTest,
            zipCodeTest,
            streetTest,
            streetNumberTest);

    EmployeeRepository.addNewEmployeeFromCLI(testEmployee);

    String customQueryFindJonDoe = "select e from Employee e where e.firstName = Jon and e.lastName = Doe";
    EntityManager entityManager = JPAUtils.openEntityManager();

    List<Employee> foundJonDoe = entityManager.createQuery(customQueryFindJonDoe).getResultList();

    Assertions.assertNotEquals(null, foundJonDoe);

    if (entityManager.isOpen()) {
        entityManager.close();
    }


} 

运行后出现错误:

原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'where 子句'中的未知列'Jon'

这个查询应该是什么样子?

【问题讨论】:

  • 你应该用' '引用参数...

标签: java sql hibernate jpa jpql


【解决方案1】:

您必须在查询上设置参数:

String customQueryFindJonDoe = 
       "select e from Employee e where e.firstName = :firstname and e.lastName = :lastName";
EntityManager entityManager = JPAUtils.openEntityManager();

TypedQuery<Employee> q = entityManager.createQuery(customQueryFindJonDoe, Employee.class);
q.setParameter("firstname", "Jon");
q.setParameter("lastName", "Doe");

List<Employee> foundJonDoe = q.getResultList();

您可以在此处找到有关查询的更多信息:

https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage002.htm#BNBRG https://www.objectdb.com/java/jpa/query

或者你买一本书 https://www.apress.com/de/book/9781484234198

【讨论】:

  • 测试通过!谢谢!您能否告诉我如何将这个找到的对象分配给单个变量而不是集合?这不是一个糟糕的交易,只是想知道 - 如果我正在寻找一个特定的实体,而不是将它添加到列表中的意义何在,而且从数据库中删除这个对象会更容易,因为它只是在测试目的。
  • 调用 getSingleResult() 而不是 getResultList()。在进行进一步开发之前,您绝对应该学习 JPA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2022-12-02
  • 2010-09-27
  • 1970-01-01
  • 2018-06-16
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多