Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
约束JPA中联接获取返回的行数_Jpa_Jpql - Fatal编程技术网

约束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