Присоединяйтесь к Hibernate Query - PullRequest
1 голос
/ 28 ноября 2011

У меня есть классы:

class User{
String id;
ArrayList<UserAttribute> attributeList=new ArrayList<UserAttribute>();
}

class UserAttribute{
User user;
String value;
String key;
}

У меня есть таблицы, связанные с классами.

таблица пользователь

column id

таблица user_attribute

column user_id
column key
column value

пример содержимого таблицы пользователя

user_id="123"

user_id="234"

пример содержимого таблицы user_attribute

user_id="123", key="address", value="green house street"

user_id=234, key="address", value="blue house street"

user_id="123", key="phone", value="234324"

user_id="234", key="phone", value="786988"

Я хочу получить пользователя, у которого есть адрес "улица зеленого дома" и (нет или) имеет телефон "234324"

Я пишу sql (oracle) в редакторе sql:

 select u.* from user u left join user_attribute prop on u.id=prop.user_id inner join user_attribute prop2 on prop.user_id = prop2.user_id where prop.value = 'green house street' and prop.key = 'address' and prop2.key ='phone'  and prop2.value = '234324';

Я много чего перепробовал на стороне гибернации: но не могу использовать соединение, потому что получаю

"незапланированный токен при ошибке"

при использовании предложения "on".

в конце я написал

entityManager.createQuery(
select u from User u, u.attributeList prop, u.attributeList prop2 where prop.value = :address and prop.key = :key and prop2.key =:key2  and prop2.value = :phone and prop.user.id=u.id and prop2.user.id=u.id and prop2.user.id=prop.user.id
)..setParameter("key", "address")
                .setParameter("phone", "234324")
                .setParameter("key2", "phone")
                .setParameter("address", "green house street").getSingleResult();

все еще нет шансов,

Я очень стараюсь найти решение для одного запроса, но пока не могу достичь.Спасибо за любую идею.

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Вам нужно сделать два объединения, но не нужно указывать ни одного предложения on, поскольку Hibernate знает, благодаря сопоставлению ассоциации, как таблицы связаны друг с другом. Таким образом, следующий запрос должен работать:

select u from User u
inner join u.attributeList a1
inner join u.attributeList a2
where a1.value = 'green house street' and a1.key = 'address' 
and a2.key ='phone' and a2.value = '234324'
1 голос
/ 15 ноября 2012

В Hibernate возникла проблема с предложением "on".

Использовать собственный SQL-запрос.

Пожалуйста, укажите Проблема HQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...