如何在JPA标准中进行内部联接?

时间:2014-08-01 22:50:52

标签: sql hibernate jpa inner-join criteria

我正在使用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。

1 个答案:

答案 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/