2017-03-21 79 views
1

得到一個列表構造需要通過JPQL查詢列表傳遞給VO(值對象)。 例如:如何通過JPQL查詢

我VO級:

public class FamilyVO { 
    private String lastName; 
    private List<Name> names; 

    public FamilyVO() { 
    } 

    public FamilyVO (List<Name> names, String lastName) { 
    this.names = names; 
    this.lastName = lastName; 
    } 
} 

使用new操作我的查詢:

public class FamilyRepositoryBean { 

    @Override 
    public List<FamilyVO> findFamilies(Long id) { 

     StringBuilder jpql = new StringBuilder("SELECT new "+ FamilyVO.class.getName()); 
     jpql.append("(f.names, f.lastName)"); 
     jpql.append(" FROM Family f "); 
     jpql.append(" WHERE f.id = :pId"); 

     Query query = em.createQuery(jpql.toString()); 
     query.setParameter("pId", id); 

     return query.getResultList(); 
    } 
}  

我的實體的家庭:

@Entity 
public class Family { 

    @OneToMany(mappedBy = "family") 
    protected List<Name> names = new ArrayList<Name>(); 

    private String lastName; 

    public Family() { 
    } 

    public List<Name> getNames(){ 
     return names; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
} 

我的實體名稱:

@Entity 
public class Name { 

    @NotNull 
    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    private Family family;  

    public Name() { 
    } 

    public Family getFamily(){ 
     return family; 
    } 

} 

當我運行此查詢,出現以下錯誤:org.hibernate.hql.ast.QuerySyntaxException:無法找到階級適當的構造

對EJB調用 java.lang.IllegalArgumentException異常的RuntimeException

+0

嗨!你能否也顯示「家庭」代碼? – Dherik

+0

添加defualt構造你的類像這樣FamilyVO(){ –

+0

的代碼錯了,我忘了把構造函數的正確名稱。 –

回答

0

如果你做一個帶參數的構造函數;你應該提供沒有參數,明確的構造函數;

public FamilyVO(){ } 
+0

嗨,這個建議不起作用,我更新了我的代碼,你能看到嗎?謝謝 –

+0

一些問題在這個網址解釋http://stackoverflow.com/questions/29224093/hibernate-unable-to-locate-closed-constructor-on-class-hql –

+0

謝謝,但沒有工作,錯誤仍在繼續。 –