2016-09-09 3 views
0

Как выбрать строку на основе уникального столбца. В моей таблице идентификатор сгенерирован автоматически. Я использую номер телефона, чтобы выбрать строку, которая уникальна в моей схеме таблицы.HQL Select Query

Ex:

Id Phone  Name 
1  2209897 abc 
2  5436567 def 

Здесь, Id является первичным ключом. Телефон уникален.

Я пользуюсь телефоном для входа. Я не хочу, чтобы список был сгенерирован, но только одна строка в качестве вывода.

@Repository 
public class CustomerDetailsDAOImpl implements CustomerDetailsDAO { 

@Autowired 
SessionFactory sessionFactory; 

@Override 
@Transactional 
public List<CustomerDetails> getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    q.setParameter("p", customerPhone); 

    List<CustomerDetails> customer = q.getResultList(); 
    session.close(); 
    return customer; 

} 
+0

Не используйте 'list', просто используйте' CustomerDetails клиент = q.getResultList(); ', если': p' возвращает более чем на 1 строку, то вы получить 'ResultSizeException', но если все номера телефонов в базе данных, безусловно, уникальны, то у вас не должно быть никаких проблем. – px06

+1

@ px06 Возможно, вы намеревались рекомендовать использовать другой метод, отличный от q.getResultList(). – Gimby

+0

@Gimby Извините, вы правы. Это должно быть: 'List getList = q.getResultList(); Клиент: = getList.get (0); ' – px06

ответ

0

Используйте getSingleResult() вместо использования getListResult(). Выполняет запрос SELECT, который возвращает один нетипизированный результат. Поэтому всякий раз, когда вы ожидаете, что одна запись будет восстановлена ​​с уникальным типом, следует использовать getSingleResult().

@Repository 
public class CustomerDetailsDAOImpl implements CustomerDetailsDAO { 

@Autowired 
SessionFactory sessionFactory; 

@Override 
@Transactional 
public List<CustomerDetails> getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    q.setParameter("p", customerPhone); 

    CustomerDetails customer = q.getSingleResult(); 
    session.close(); 
    return customer; 

} 

Надеется, что это помогает :)

0

Не используйте q.getResultList() вместо этого использовать q.getSingleResult(), как телефонный номер является уникальным в вашей базе данных, то запрос будет возвращать один объект из CustomerDetails класса.

public CustomerDetails getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    CustomerDetails customer=null; 
    q.setParameter("p", customerPhone); 
    try{ 
     customer = q.getResultList(); 
    }catch(NoResultException ex){ 
    System.out.println(ex.getMessage()); 

    }finally{ 
     session.close(); 
    } 

    return customer; 

} 

Примечание: Если запрос не извлекает никаких данных из базы данных, то getSingleResult() выбросит NoResultException исключение. Итак, вам нужно обработать это исключение с вашей стороны.

Вы можете использовать приведенный выше пример для справки. Я добавил код для обработки исключений NoResultException.

+0

[Почему вы не должны использовать getSingleResult() в JPA] (http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult -in-jpa /), стоит посмотреть. – px06

+0

Я согласен с тобой @ px06. Но user3550981 хочет вернуть один результат, поэтому я предложил это решение. – Abhijeet