使用spring和hibernate使用javax.persistence.Query选择一条记录

时间:2018-06-18 17:36:45

标签: java spring hibernate spring-mvc java-ee

我正在使用带有hibernate的spring boot项目, 如何使用 javax.persistence.Query

进行查询
@Override
   public List<Bank> balance(String account_name) {
       Query query = entityManager.createNativeQuery("SELECT balance from bank WHERE account_name=:account_name", Bank.class);
       query.setParameter("account_name",account_name);
       if (query.getResultList().size() == 1 ) {
           return query.getResultList();
       }

       return null;

   }

这是错误

  

&#34; message&#34;:&#34;无法执行查询; SQL [从银行中选择余额];   嵌套异常是org.hibernate.exception.SQLGrammarException:可以   不执行查询&#34;

1 个答案:

答案 0 :(得分:1)

我稍微更新了你的代码,请尝试一下,下面有一些解释:

@Override
public List<Bank> balance(String account_name) {
  Query query = entityManager.createNativeQuery("select * from <TABLE_NAME> where <COLUMN_NAME> = ?", Bank.class);
  query.setParameter(1, account_name); // here we set value for param (it's "?" in the SQL)
  query.setMaxResults(1); // this is used to limit the result list

  // you should probably remove this
  /* if (query.getResultList().size() == 1 ) {
    return query.getResultList();
  }*/

  return query.getResultList();
}

首先,本机SQL查询:您需要在那里使用表名和列名,因此这些<TABLE_NAME><COLUMN_NAME>必须替换为您的表名和列名( not实体名称或实体的字段名称!)。

其次,如果您只想获得一条记录,最好使用query.setMaxResults(1);您也可以更改其参数 - 根据需要检索任意数量的记录。

如果你知道你总是只需要1条记录,那么改变你的方法是有意义的。尝试类似这样的代码:

@Override
public Bank balance(String account_name) {
  Query query = entityManager.createNativeQuery("select * from <TABLE_NAME> where <COLUMN_NAME> = ?", Bank.class);

  query.setParameter(1, account_name);
  query.setMaxResults(1);

  return (Bank)query.getSingleResult();
}

在这种情况下,您可以使用getSingleResult()代替getResultList()

通常,如果您的方法返回一个smth列表,则返回null不是一个好习惯。像这样public List<Bank> balance(String account_name)。例如,最好返回一个空列表。

希望这有道理:)

快乐的黑客攻击!