我正在使用Netbeans编写一个返回JSON响应的Web服务REST,我也使用JPA Criteria来创建查询。我有两个实体看起来像这样:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "id_user")
private Integer idUser;
@Size(max = 45)
@Column(name = "username")
private String username;
@Size(max = 45)
@Column(name = "password")
private String password;
@Size(max = 45)
@Column(name = "email")
private String email;
@OneToMany(mappedBy = "idUser")
private Collection<Comment> commentCollection;
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "id_comment")
private Integer idComment;
@Column(name = "id_thesis")
private Integer idThesis;
@Size(max = 250)
@Column(name = "comment")
private String comment;
@Column(name = "cdate")
@Temporal(TemporalType.DATE)
private Date cdate;
@JoinColumn(name = "id_user", referencedColumnName = "id_user")
@ManyToOne
private User idUser;
}
具有集合和获取的两个实体。我想做一个这样的查询:
SELECT * FROM Comments c INNER JOIN User u WHERE c.id_user = u.id_user;
但是在JPA Criteria语言中,我尝试使其工作时遇到了很多问题,但我还没有得到它。
这是我用于连接的代码
AbstractFacade.java
public Join<User, Comment> getCommentInfo() {
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery q = cb.createQuery();
Root<User> r = q.from(User.class);
Join<User, Comment> j = r.join("commentCollection", JoinType.INNER);
Query query = getEntityManager().createQuery(q);
return (Join<User, Comment>) query.getResultList();
}
UserFacadeREST.java
@GET
@Path("test")
@Produces({"application/json"})
public Join<User, Comment> getCommentInfoREST() {
return getCommentInfo();
}
测试方法时会显示此错误:
java.util.Vector无法强制转换为javax.persistence.criteria.Join
请帮助我,我不知道句子加入是否错误或如何正确解决演员。
编辑:我将下一行添加到getCommentInfo()方法中以查看列表的内容。
q.select(j.get("username"));
List results = query.getResultList();
Iterator iter = results.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
错误:托管类型中不存在[username]属性[EntityTypeImpl @ 1000979996:Comment。
答案 0 :(得分:1)
对于getResultList(),javadocs声明它返回java.util.List
(参见此处:http://docs.oracle.com/javaee/5/api/javax/persistence/Query.html#getResultList%28%29),Vector实现。
结果类型,即列表中的内容,取决于条件投影,或者在JPQL查询中,取决于from语句。
在您的情况下,因为您不进行投影,我认为它应该返回List<User>
。
为了您的信息,如果您使用的是JPA 2.0,您也可以使用TypedQuery来避免这种情况(丑陋!)演员:http://www.javabeat.net/typedquery-jpa-2/