我正在使用带有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;
答案 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)
。例如,最好返回一个空列表。
希望这有道理:)
快乐的黑客攻击!