HQL с коллекцией в предложении WHERE - PullRequest
9 голосов
/ 19 ноября 2009

Я пытался ответить на этот вопрос, который официально вызывает у меня кошмары. Система управления пользователями и контактами. Итак, у меня есть UserAccount, Contact и Phone.

UserAccount имеет двунаправленную связь один-ко-многим с Contact и однонаправленную связь на телефоне, все сопоставленные Set:

//UserAccount mapping 
@OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL})
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Phone> phones = new HashSet<Phone>();

@OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Contact> contacts = new HashSet<Contact>();

У контакта теперь есть однонаправленная связь с телефонами

@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL})
private Set<Phone> phones = new HashSet<Phone>();

Я пишу метод проверки наличия одного и того же номера для одного и того же контакта определенного пользователя по уникальному полю электронной почты.

Я знаю, что мог бы переопределить equals и hashcode для этого, но так как телефон в сущности сопоставлен с множеством, я не знаю в данный момент, как это сделать. Поэтому я хотел предоставить метод проверки этой уникальности для меня перед каждой записью на странице контактов

public boolean checkForExistingPhone(String userEmail, String formatedNumber) {
    List<Contact> result = null;
    Session sess = getDBSession().getSession();

    String query = "select Contact ,cphones.formatedNumber from Contact c inner join    Contact.phones cphones where c.UserAccount.email = :email and cphones.formatedNumber= :number";
//        try {
        result = (List<Contact>) sess.createQuery(query)
                .setParameter("email", userEmail)
                .setParameter("number", formatedNumber).list();
//        } catch (HibernateException hibernateException) {
//            logger.error("Error while fetching contacts of email " + userEmail + " Details:"     + hibernateException.getMessage());
//        }
        if(result == null)
            return false;
        else
            return true;
}

У меня продолжает появляться эта ошибка:

org.hibernate.hql.ast.QuerySyntaxException: Contact is not mapped [select
cphones.formatedNumber from Contact c inner join Contact.phones cphones where
c.UserAccount.email = :email and cphones.formatedNumber= :number]. 

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

1 Ответ

16 голосов
/ 19 ноября 2009

HQL-запрос, вероятно, будет выглядеть примерно так:

select c
from Contact c
join c.phones cphones
where c.userAccount.email = :email
  and cphones.formatedNumber = :number

Также вы можете обрабатывать результаты запроса, как этот. Метод list () всегда возвращает список, а не ноль.

 return !result.isEmpty();
...