2014-11-29 3 views
0

Я пытаюсь выполнить свои первые шаги на Java, и я заблокирован следующей проблемой: у меня есть этот класс hieararchy «Пользователь -> Путешественник».Querying по унаследованному свойству

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class User { 
    // Some properties and accessors. 
} 

@Entity 
@PrimaryKeyJoinColumn(name="user_id") 
public class Traveller extends User{ 
    // Some properties and accessors. 
} 

Итак, мне нужно найти путешественника по имени пользователя, которое является свойством класса пользователя. Я стараюсь это в моем TravellerDao:

public Traveller findByUsername(String username){ 

    EntityManager em = PersistenceHelper.getEm(); 
    TypedQuery<Traveller> query = em.createQuery("FROM Traveller WHERE username = ?1", Traveller.class); 
    query.setParameter(1, username); 

    return query.getSingleResult(); 
} 

Но javax.persitence.NoResultException является пойманным. В чем проблема ? В «где» клаузула? В соединении?. Есть идеи ?

Примечания:

1) Иерархия в порядке с "найти" метод работы. И база данных генерируется правильно.

2) У меня есть запись в таблице Traveler, которая связывает до одного в таблице User.

3) В базе данных существует пользователь с именем пользователя, которое я использую для тестирования.

4) Метод корректно использует параметр «имя пользователя».

EDIT: теперь работает. Проблема заключалась в порядке выполнения тестовых случаев. Запрос работает нормально.

ответ

1

Я думаю, что ваш запрос неверен, я считаю, что вы вынуждены назвать псевдоним для каждого объекта, с которым хотите взаимодействовать. Вы пробовали это?

"SELECT t FROM Traveller t WHERE t.username = ?1", Traveller.class 

Также вам следует придать результат при вызове query.getSingleResult(). Поскольку вы проходите в Traveller.class в вызов createQuery, который параметризируется Class<T> resultClass

Редактировать: Добавлено 1 после? как показано здесь. http://www.objectdb.com/java/jpa/query/parameter#Ordinal_Parameters_index_

public Country getCountryByName(EntityManager em, String name) { 
    TypedQuery<Country> query = em.createQuery(
     "SELECT c FROM Country c WHERE c.name = ?1", Country.class); 
    return query.setParameter(1, name).getSingleResult(); 
    } 
+0

Изменить запрос, но результаты одинаковы. – ramiromd

+0

Вы проверили, что ваша база данных содержит в себе правильные данные, просмотрев SQL-запрос? Вы видите запись в таблице Traveler, которая связывает до одного в таблице User? У них есть имя пользователя, которое вы ожидаете? Вы проверили, чтобы передать правильное имя пользователя в метод findByUsername? Я бы сделал system.out.println() имени пользователя до того, как SQL запустится для чего-то быстрого и грязного. – Jazzepi

+0

Да, у меня есть пользователь с желаемым именем пользователя. И да, параметр в порядке. – ramiromd

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