如何使用JPA或HQL动态排序多对多关系?

2023-12-29

我有一个这样的映射:

@ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
            name="product_product_catalog",
            joinColumns={@JoinColumn(name="product_catalog", referencedColumnName="product_catalog")},
            inverseJoinColumns={@JoinColumn(name="product", referencedColumnName="product")})
    public List<Product> products = new ArrayList<Product>();

我可以很好地获取目录中的产品,但我无法(动态)订购产品。 我怎样才能订购它们? 我可能必须使用 order-by 子句编写多对多 HQL 查询?我想将 orderBy 字段名称字符串传递给查询,或者有更好的解决方案吗?

表格是: 产品, 产品目录, Product_product_catalog(关联表)

附:使用“玩”!我的实体的框架 JPASupport。


我可以很好地获取目录中的产品,但我无法(动态)订购产品。我怎样才能订购它们?

如果您让 JPA 检索关联,则不可能。映射是静态的,您可以对映射做的最好的事情是指定“检索时间”的顺序:

9.1.28 按注释排序

The OrderBy注释指定在检索关联时集合值关联的元素的顺序。

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
   String value() default "";
}

值排序的语法 元素是一个按列表排序, 作为 如下:

orderby_list::= orderby_item [,orderby_item]*
orderby_item::= property_or_field_name [ASC | DESC]

如果未指定 ASC 或 DESC,则假定为 ASC(升序)。

如果未指定排序元素,则假定按关联实体的主键排序。

属性或字段名称必须与关联类的持久属性或字段的名称相对应。排序中使用的属性或字段必须与支持比较运算符的列相对应。

Example:

@Entity public class Course {
  ...
  @ManyToMany
  @OrderBy("lastname ASC")
  public List<Student> getStudents() {...};
  ...
}

因此,要么使用自定义查找器,要么使用 Java 对列表进行排序Comparator.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用JPA或HQL动态排序多对多关系? 的相关文章

随机推荐