2016-09-21 22 views
0

Следующий метод использует createNativeQuery() метод управляющего объекта Java:Синтаксис собственного запроса EntityManager?

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+ "' " 

т.е. мне нужно как ' и "?

ответ

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-- в качестве идентификатора вашей функции, пользователь получает полный список Собаков.

Используйте параметры и избежать такого рода проблем, запросы также более читаемые и менее подвержены ошибкам:

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

Спасибо Я добавил e.printStackTrace(), который показал, что ошибка возникает, когда запрос пытается выполнить. Это объясняет возврат пустых списков? – java123999

+0

Принятый ответ, поскольку он помог решить мою проблему. В моем коде была ошибка, которую я игнорировал. Ошибка заключалась в том, что мой сценарий обновления БД не был запущен, поэтому Hibernate искал колонку, которая еще не была там. – java123999

0

Чтобы избежать проблем, следует использовать Params:

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

 Смежные вопросы

  • Нет связанных вопросов^_^