EntityManager本机查询语法?

时间:2016-09-21 10:41:47

标签: java jdbc persistence 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;
    }

我遇到的问题是,当我希望这样做时,此方法返回结果。即当我直接通过SQL Developer运行查询时,我得到结果,但该方法不会返回相同的结果。

我的Syntax是否正确?我不确定这个:

" SELECT * FROM DOG WHERE ID = '" + id+ "' "

即。我是否需要'"

2 个答案:

答案 0 :(得分:1)

您的语法是正确的,但您的代码中还有其他问题。

你默默地忽略了这个例外。您可能正在获取异常,忽略它然后返回空列表:

    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.
    }

如果使用不带参数绑定的查询,则可能会出现SQL注入问题。举个例子,如果有人在你的函数中发送了0' OR 1=1--作为id,那么用户就会获得一个完整的Dogs列表。

使用参数并避免此类问题,查询也更具可读性且不易出错:

.createNativeQuery(" SELECT * FROM DOG WHERE ID = ?1, DogEntity.class)
.setParameter(1, id)
.getResultList();

答案 1 :(得分:0)

为避免出现问题,您应该使用参数:

Query query = em.createNativeQuery("SELECT * FROM DOG WHERE ID =  ?");  
query.setParameter(1, id);