Могу ли я указать тип объекта результата для запроса HQL? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть объект в спящем режиме, который называется ключевыми словами.Он хранит список слов и количество раз, которое встречается каждое слово.Слова не уникальны.Я хочу подвести итог для каждого слова в списке.Я использую HQL

query select keyword, sum(keywordcount) from Keywords as Keywords group by keyword order by sum(keywordcount) desc

, что дает мне правильный результат.У меня проблема в том, что когда я отправляю этот запрос, я получаю список объектов java.lang.Object.Есть ли способ, которым я могу сказать HQL дать мне список объектов типа Ключевые слова, так как они имеют желаемую структуру.

@Entity
@Table(name = "keywords", catalog = "akiradev")
public class Keywords implements java.io.Serializable {

// Fields

private Integer id;
private Documents documents;
private String keyword;
private Integer keywordcount;

// Constructors

/** default constructor */
public Keywords() {
}

/** full constructor */
public Keywords(Documents documents, String keyword, Integer keywordcount) {
    this.documents = documents;
    this.keyword = keyword;
    this.keywordcount = keywordcount;
}

// Property accessors
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
    return this.id;
}

public void setId(Integer id) {
    this.id = id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "document_id")
public Documents getDocuments() {
    return this.documents;
}

public void setDocuments(Documents documents) {
    this.documents = documents;
}

@Column(name = "keyword")
public String getKeyword() {
    return this.keyword;
}

public void setKeyword(String keyword) {
    this.keyword = keyword;
}

@Column(name = "keywordcount")
public Integer getKeywordcount() {
    return this.keywordcount;
}

public void setKeywordcount(Integer keywordcount) {
    this.keywordcount = keywordcount;
}
}

------- запрос -------

public List<Keywords> getKeywordSum() {
    try {

        String queryString = "select keyword, sum(keywordcount) from Keywords as Keywords group by keyword order by sum(keywordcount) desc";
        Query queryObject = getSession().createQuery(queryString);
        List<Keywords> results = (List<Keywords>) queryObject.list();
        return results;
    } catch (RuntimeException re) {
        log.error("finding Documents in descending time order failed", re);
        throw re;
    }
}

1 Ответ

3 голосов
/ 11 ноября 2010

Использование Keyword в качестве возвращаемого типа здесь не имеет особого смысла, потому что результаты запроса не совпадают с ключевыми словами.Однако вы можете создать DTO для представления результатов этого запроса

public class KeywordStats {
    private String keyword;
    private int count;
    public KeywordStats(String keyword, int count) { ... }
    ...
}

и использовать синтаксис конструктора для его возврата из запроса:

select new KeywordStats(keyword, sum(keywordcount)) from Keywords as Keywords group by keyword order by sum(keywordcount) desc  

На самом деле вы можете использовать тот же подходвернуть Keyword s, но я бы не рекомендовал это, поскольку это злоупотребление объектом.

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