约束JPA中联接获取返回的行数
我有一个产品对象,其中包含相关产品的列表(也是产品对象)。相关产品的字段注释如下:约束JPA中联接获取返回的行数,jpa,jpql,Jpa,Jpql,我有一个产品对象,其中包含相关产品的列表(也是产品对象)。相关产品的字段注释如下: public class Product { @JoinTable(name = "RELATED_PRODUCT", joinColumns = { @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = { @JoinCo
public class Product {
@JoinTable(name = "RELATED_PRODUCT", joinColumns = {
@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = {
@JoinColumn(name = "RELATED_PRODUCT_ID", referencedColumnName = "id", nullable = false)})
@ManyToMany(fetch = FetchType.LAZY)
List<Product> relatedProducts;
}
但这不起作用。它总是返回数据库中的所有相关产品,而不仅仅是评级高于3的产品。如何解决此问题?解决此问题的最简单方法是单独加载相关产品,而不是尝试将其放入
相关产品
字段
从面向对象的角度来看,它也非常有意义。我想您有类似“产品页面”的内容,其中包含所选产品和“推荐产品”。如果是这样的话,这样的页面是一个独立的概念,应该有自己的类别:
public class ProductPage {
private Product product;
private List<Product> recommendedProducts;
...
}
或者通过两个单独的查询
不幸的是,这种方法不允许您直接从JPA接收
ProductPage
的实例,您需要手动编写转换代码。解决此问题的最简单方法是单独加载相关产品,而不是尝试将其放入relatedProducts
字段
从面向对象的角度来看,它也非常有意义。我想您有类似“产品页面”的内容,其中包含所选产品和“推荐产品”。如果是这样的话,这样的页面是一个独立的概念,应该有自己的类别:
public class ProductPage {
private Product product;
private List<Product> recommendedProducts;
...
}
或者通过两个单独的查询
不幸的是,这种方法不允许您直接从JPA接收
ProductPage
的实例,您需要手动编写转换代码。Hmm。。。有一点缺陷,JPA不能这么做,还是我错了?我想将评级>3的产品对象添加到列表中不会太困难。毕竟,这样的机制可以在没有获取的情况下使用(即:我可以轻松获取评级>3的“原始”产品),并且也是SQL的一部分。当你说你的答案是我问题的答案时,我相信你,但这似乎很麻烦。我想要的只是一个包含相关产品的产品。它们是特定产品的一部分,所以它们应该属于它,即使从面向对象的角度来看也是如此。问题是,它在某种意义上违背了JPA的精神,因为JPA假设持久字段的状态反映了数据库的状态。是的,我同意这一点,但我的情况似乎是任何程序员都可以遇到的。只是一个典型的关系问题。我真的认为会有一个好的和干净的方式来做这件事,但不幸的是没有。看来我不得不接受这一点。无论如何,谢谢你的回答!隐马尔可夫模型。。。有一点缺陷,JPA不能这么做,还是我错了?我想将评级>3的产品对象添加到列表中不会太困难。毕竟,这样的机制可以在没有获取的情况下使用(即:我可以轻松获取评级>3的“原始”产品),并且也是SQL的一部分。当你说你的答案是我问题的答案时,我相信你,但这似乎很麻烦。我想要的只是一个包含相关产品的产品。它们是特定产品的一部分,所以它们应该属于它,即使从面向对象的角度来看也是如此。问题是,它在某种意义上违背了JPA的精神,因为JPA假设持久字段的状态反映了数据库的状态。是的,我同意这一点,但我的情况似乎是任何程序员都可以遇到的。只是一个典型的关系问题。我真的认为会有一个好的和干净的方式来做这件事,但不幸的是没有。看来我不得不接受这一点。无论如何,谢谢你的回答!
SELECT DISTINCT p, cp FROM Product p LEFT JOIN p.comparableProducts cp WHERE p.id = :id AND cp.rating > 3 AND CURRENT_DATE BETWEEN p.commenceDate AND p.removeDate