Hibernate NamedQuery,设置值

时间:2015-11-24 22:01:05

标签: java hibernate wrapper

晚上好!我正在尝试将查询中的值设置为包装类TestWrapper

TestWrapper类

package com.bionic.wrappers;

public class TestWrapper {

    private String name;
    private int duration;

    public TestWrapper(){
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }
}

以下是我的查询

@NamedQuery(name = "getAvailableTestsNames",
    query = "SELECT test.testName, test.duration FROM Result result JOIN   result.test test JOIN result.user user where user.id = :userId"

DAO课程

    public List<TestWrapper> getAvailableTestsNames(long id){
    Query query = em.createNamedQuery("getAvailableTestsNames");
    query.setParameter("userId", id);
    return (List<TestWrapper>)query.getResultList();
}

我得到一个例外,我看到这里的值不合适:

    public static Set<TestDTO> convertAvailableTestsToDTO(List<TestWrapper> tests){
    Set<TestDTO> testDTOs = new HashSet<>();
    for (TestWrapper test : tests){
        TestDTO testDTO = new TestDTO(test.getName(), test.getDuration());
        testDTOs.add(testDTO);
    }
    return testDTOs;
}

我得到费用

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.bionic.wrappers.TestWrapper

谢谢!

1 个答案:

答案 0 :(得分:1)

我没有足够的上下文,但在getAvailableTestsNames中。看起来你正在通过返回&#34; test.testName,test.duration&#34;来执行返回标量结果的查询。你可能只想返回一个TestWrapper列表,所以查询应该只是&#34;来自XXX&#34; ,你可以省略select field1,field2 ... hibernate为你做的。

见第11.4.1.3节。 https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch11.html#objectstate-querying与11.4.1的标量结果。执行查询

希望这有帮助

了Aa。