Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以为HQL查询指定结果对象类型吗?_Java_Hibernate_Hql - Fatal编程技术网

Java 我可以为HQL查询指定结果对象类型吗?

Java 我可以为HQL查询指定结果对象类型吗?,java,hibernate,hql,Java,Hibernate,Hql,我在hibernate实例中有一个名为keywords的实体。它存储单词列表和每个单词出现的次数。词语不是唯一的。我想把列表中每个单词的总数加起来。我使用HQL query select keyword, sum(keywordcount) from Keywords as Keywords group by keyword order by sum(keywordcount) desc 这给了我正确的结果。我遇到的问题是,当我提交这个查询时,我得到了java.lang.Object对象的列表

我在hibernate实例中有一个名为keywords的实体。它存储单词列表和每个单词出现的次数。词语不是唯一的。我想把列表中每个单词的总数加起来。我使用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;
    }
}
这里使用关键字作为返回类型没有多大意义,因为查询结果与关键字没有相同的标识。但是,您可以创建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  

实际上,您可以使用相同的方法返回关键字,但我不推荐使用,因为这是对实体对象的滥用。

谢谢。你的解决方案不是我想的,但实际上比我想的要明智得多:你是对的,我希望将结果强制到实体对象中,但使用DTO是一个更干净的解决方案。