Подтвердить что ты не робот

Как вернуть карту <ключ, значение> с помощью HQL

У меня есть таблица

Разрешение

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

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

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

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);

где две строки: permission_id, имя_выпуска.

4b9b3361

Ответ 1


@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);

Ответ 2

попробуйте это,

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(); 

Ответ 3

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

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

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

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

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

Ответ 5

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"));
    }