как вернуть Map <Key, Value> с HQL - PullRequest
32 голосов
/ 24 октября 2011

у меня есть стол

Разрешение

  • ID
  • имя
  • 1012 * убывание *

что я сейчас делаю сделать запрос, который возвращает объект разрешения, а затем программно поместить значения в карту

1- Но мне было интересно, можно ли сделать HQL (или нативный sql, если это невозможно), чтобы выбрать allow_id , license_name и вернуть их в карту.

2 - можно ли вернуть карту в отношении один ко многим вместо следующего списка или установить

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
    private List<Permission> permissions = new ArrayList<Permission>(0);

возможно ли иметь что-то вроде:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
        private Map<String,String> permissions = new ArrayList<String,String>(0);

где две строки: идентификатор_правки , имя_презентации .

Ответы [ 5 ]

29 голосов
/ 24 октября 2011
  1. Используйте синтаксис select new map в HQL для извлечения результатов каждой строки в Map. Посмотрите на следующий вопрос, который решает проблему: Как получить результат запроса гибернации в виде ассоциативного массива списка или хэш-карты . Например, следующий HQL: select new map(perm.id as pid, perm.name as pname) from Permission perm вернет List из Map с, каждый с ключами "pid" и "pname".

  2. Невозможно сопоставить ассоциацию с Map<String, String>. Можно отобразить ключ карты в столбец с аннотацией @MapKeyColumn в ассоциации. См. Этот вопрос, который также решает проблему, например: JPA 2.0 Hibernate @OneToMany + @ MapKeyJoinColumn . Здесь - еще один пример.


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", 
    joinColumns = { @JoinColumn(name = "perm_cat_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "permission_id") })
@MapKeyColumn(name="permission_id")
private Map<String, Permission> permissions = new HashMap<String,Permission>(0);

17 голосов
/ 28 сентября 2013

попробуй так,

Session session = sessionFactory.getCurrentSession();
String HQL_QUERY = "select new map(user.id as id, user.firstName as fullName) from User user";        
List<Map<String,String>> usersList = session.createQuery(HQL_QUERY).list(); 
7 голосов
/ 25 октября 2011

1- Но мне было интересно, можно ли сделать HQL (или нативный sql если это невозможно), чтобы выбрать идентификатор_пол верните их на карту.

возможно с Resulttransformer

String queryString="select id, name from Permission ";
List<List<Object>> permission= session.createQuery(queryString)
      .setResultTransformer(Transformers.TO_LIST).list();
//now you just expect two columns 
HashMap<Integer,String> map= new HashMap<Integer,String>();
for(List<Object> x: permission){ 
     map.put((Integer)x.get(0),(String)x.get(1))
}
4 голосов
/ 24 октября 2011

В JPA 2.0 (которые поддерживаются в последних версиях Hibernate) вы можете отображать коллекции примитивов, используя аннотацию @ElementCollection.

Для некоторых примеров таких сопоставлений см. документы коллекций hibernate .

Если вы на самом деле не отображаете его таким образом, но хотите создать карту, используя запрос HQL или Criteria, вы можете создать ResultTransformer , чтобы создать карту извозвращенный набор результатов.

Судя по ответу Хави, я думаю, что в HQL также есть поддержка для создания карты без использования преобразователя.

1 голос
/ 03 апреля 2015
String sqlQuery="select userId,name,dob from user"

Передать запрос следующему методу.

public List<Map<String,Object>> getDataListBySQL(final String sql, final Long adId){

    List<Map<String,Object>> list=(List<Map<String,Object>>)getHibernateTemplate().executeFind(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException,SQLException {
            Query query=session.createSQLQuery(sql);
            query.setParameter("adId", adId);               
            return query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
        }
    }); 
    return list;
}

Iterate this list in this way-
for(int i=0;i<list.size();i++){

        Map<String,Object> map=list.get(i);

        System.out.println(map.get("userId"));
        System.out.println(map.get("name"));
    }
...