JPA 条件 API 加入

JPA Criteria API join

请帮我一下。我已经阅读了大约 10 篇文章,但不了解 join moment。我有 2 个表:

public class News implements Serializable {
@Id
@GeneratedValue (generator = "increment")
@GenericGenerator (name = "increment", strategy = "increment")
private int id;
@Column
private String name;
@Column
private Date created;
@Column
private String data;
@ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn (name = "category_id")
private NewsCategoryDict category;
// getters, setters
}

public class NewsCategoryDict implements Serializable {
@Id
@GeneratedValue (generator = "increment")
@GenericGenerator (name = "increment", strategy = "increment")
private int id;
@Column
private String name;
@OneToMany (mappedBy = "category", cascade = CascadeType.ALL)
private List<News> news = new ArrayList<>();
}

我想要一个像

这样的查询
SELECT * FROM news, categorynews WHERE news.category_id = categorynews.id;

然后用

在jsp中得到结果
    <div id="list_news">
        <c:forEach items="${news}" var="news">
            <h5>${news.id} : ${news.name} - ${news.created} ; ${news.data} (${news.category.name})</h5>
        </c:forEach>
    </div>

而且我无法理解这个 JOIN with Criteria API。你能帮助我吗 ? 尝试使用此代码段,但出现错误

public List<News> getAll() {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<News> cq = cb.createQuery(News.class);
    Root<News> rootFromNews = cq.from(News.class);
    Join<NewsCategoryDict, News> join = rootFromNews.join("category");
    cq.select(join);

    return em.createQuery(cq).getResultList();
}

PropertyNotFoundException: Property 'created' not found on type ru.r1k0.spring.model.NewsCategoryDict

您的错误与加入无关!实际发生的情况是,在 JSP 片段中,您试图访问 ${news.created} NewsCategoryDict。我认为错误出在 JSP 片段中,而不是在 Criteria 查询中。

我的理解是你想列出 News 对象,但在查询中你选择了 NewsCategoryDict,这就是为什么最后你缺少属性,因为 NewsCategoryDict 不包含 ${news.created}

假设您想要 return News 的实例与 NewsCategoryDict 的实例相关联,您的条件查询应如下所示:

public List<News> getAll() {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<News> cq = cb.createQuery(News.class);
    Root<News> rootFromNews = cq.from(News.class);
    Join<News, NewsCategoryDict> join = rootFromNews.join("category"); // #1
    cq.select(rootFromNews);  // #2

    return em.createQuery(cq).getResultList();
}

修改的行标有#1#2注释。

查询应该 return 所有 News 具有匹配的 NewsCategoryDict;但是 NewsNewsCategoryDict 记录无关的记录将不会被 return 编辑。