在休眠我要運行該JPQL/HQL查詢:這是可能的:JPA/Hibernate查詢與結果中的列表屬性?
select new org.test.userDTO(u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
userDTO類:
public class UserDTO {
private Integer id;
private String name;
private List<SecurityRole> securityRoles;
public UserDTO(Integer id, String name, List<SecurityRole> securityRoles) {
this.id = id;
this.name = name;
this.securityRoles = securityRoles;
}
...getters and setters...
}
用戶實體:
@Entity
public class User {
@id
private Integer id;
private String name;
@ManyToMany
@JoinTable(name = "user_has_role",
joinColumns = { @JoinColumn(name = "user_id") },
inverseJoinColumns = {@JoinColumn(name = "security_role_id") }
)
private List<SecurityRole> securityRoles;
...getters and setters...
}
但是當Hibernate 3.5(JPA 2 )開始我得到這個錯誤:
org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate
constructor on class [org.test.UserDTO] [SELECT NEW org.test.UserDTO (u.id,
u.name, u.securityRoles) FROM nl.test.User u WHERE u.name = :name ]
是否包含列表(u.securityRoles)的選擇不可用?我應該創建2個單獨的查詢嗎?
謝謝!我應該只是在JPA規範中查找它。顯然u.securityRoles不是'single_valued_path_expression'。所以我想這意味着,必須爲檢索集合/關係(或使用連接並使用循環創建集合)進行單獨的查詢。 – Kdeveloper 2010-04-20 22:09:22
@Kdeveloper如果你的用戶有很多屬性,我想是的。如果沒有,只需選擇用戶並獲取他的安全角色即可。 – 2010-04-20 22:25:05
@pascal thivent如果JPQL返回很多用戶,它最終將導致循環來檢索每個用戶權限的securityRoles? – HopeKing 2017-07-27 13:26:58