2016-02-05 8 views
0

В приложении весны mvc у меня есть 3 таблицы базы данных (включая одну таблицу сопоставления) и их два соответствующих элемента java.Выберите запись, где id является идентификатором коллекции

Субъектами являются: -

public class User { 
     private Long id; 
     private String userName; 

     @ManyToMany(fetch = FetchType.EAGER) 
     @JoinTable(name = "user_location", 
     joinColumns  = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "location_id", referencedColumnName = "id")} 
       ) 
     private Set<Location> location; 
    } 

public class Location { 
     private Long id; 
     private String locationCode; 
    } 

Три таблицы пользователей, местоположение и USER_LOCATION.

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

illegal attempt to dereference collection [{synthetic-alias}{non-qualified-property-ref}] with element property reference [id] 

или получить список объектов пользователя и местоположения. Я просто хочу список пользовательских объектов.

  • от пользователя, где UserName =: имя пользователя и: locationId в (location.id)
  • от пользователя внутренней присоединиться к user.location LOC, где user.username =: usersName и loc.id =: locationId

Update: Я попробовал запрос,

Query query = getCurrentSession().createQuery("from User user inner join user.location loc where user.userName = :usersName and loc.id = :locationId"); 

Hibernate генерирует следующий простой SQL сверху запрос и возвращает список объектов User и Location. Например, если есть одно место для пользователя, которое соответствует приведенному выше запросу, hibernate возвращает список, содержащий один объект User и один объект Location.

select 
     user0_.id as id1_18_0_, 
     location2_.id as id1_5_1_, 
     user0_.user_name as user_na11_18_0_, 
     location2_.location_code as location3_5_1_  
    from 
     users user0_ 
    inner join 
     user_location location1_ 
      on user0_.id=location1_.user_id 
    inner join 
     location location2_ 
      on location1_.location_id=location2_.id 
    where 
     user0_.user_name=? 
     and location2_.id=? 
+0

Что вы имеете в виду список пользователей и размещения объектов? Не могли бы вы добавить свой запрос к сообщению? –

+0

Здравствуйте, Орест, пожалуйста, ознакомьтесь с моим обновлением в ответ на ваш комментарий. Спасибо – ivish

ответ

1

Вы можете попробовать использовать следующие критерии:

Criteria criteria = getCurrentSession().createCriteria(User.class, "u"); 
criteria.createAlias("location", "loc"); 
criteria.add(Restrictions.eq("u.userName", "userName"); 
criteria.add(Restrictions.eq("loc.id", locationId); 

List<User> users = criteria.list(); 

Или вы можете попробовать HQL напечатал запрос:

TypedQuery<User> query = 
    getCurrentSession().createQuery("SELECT User.* FROM User u JOIN user_location ul ON u.id = ul.user_id JOIN Location l ON ul.location_id = l.id WHERE u.userName = :userName AND l.id = :locationId", User.class) 
     .setParameter("userName", "userName") 
     .setParameter("locationOd", locationId); 

List<User> users = query.getResultList(); 
+0

Большое спасибо Orest. Первый подход работает для меня. – ivish

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