jav*_*999 7 java persistence jdbc entitymanager nativequery
以下方法使用Java 实体管理器的createNativeQuery()方法:
public List<Dog> findDogById(String id) {
List<Dog> resultList = new ArrayList<>();
try {
resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList();
} catch (Exception e) {
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我期望该方法返回结果时,它没有返回结果。即,当我直接运行查询时,SQL Developer我得到结果,但该方法不会返回相同的结果。
我的Syntax正确吗?我对此不确定:
" SELECT * FROM DOG WHERE ID = '" + id+ "' "
Run Code Online (Sandbox Code Playgroud)
即我需要 the'和 the吗"?
Dav*_* SN 11
您的语法是正确的,但您的代码中存在其他问题。
你默默地忽略了这个异常。您可能会遇到异常,忽略它然后返回空列表:
try {
resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList();
} catch (Exception e) {
// If an exception is thrown in this try block, you are ignoring it.
}
Run Code Online (Sandbox Code Playgroud)
如果您使用没有参数绑定的查询,则可能会遇到 SQL 注入问题。举个例子,如果有人0' OR 1=1--在您的函数中作为 id 发送,用户将获得狗的完整列表。
使用参数并避免此类问题,查询也更具可读性且不易出错:
.createNativeQuery(" SELECT * FROM DOG WHERE ID = ?1", DogEntity.class)
.setParameter(1, id)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17895 次 |
| 最近记录: |