首页 > 解决方案 > @OrderColumn 未能按插入顺序对数组列表进行排序

问题描述

需要 ArrayList 按保存到数据库的顺序保存对象。使用 @OrderColumn 来实现这一点,但由于某种原因,它无法按从头到尾排序。

以下测试保存 2 个对象并尝试按降序检索对象(见最后一行),但失败了。

Watching.class

  @ManyToMany(cascade = CascadeType.ALL,
      targetEntity = Ticker.class,
      fetch = FetchType.LAZY)
  @JoinTable(name="watching_ticker",
      joinColumns = @JoinColumn(name="watching_id"),
      inverseJoinColumns= @JoinColumn(name="ticker_id"))
  @OrderBy("id desc")
  private List<Ticker> tickers;

...

Ticker.class
  @JsonIgnore
    @ManyToMany
    @JoinTable(name ="watching_ticker",
        joinColumns = @JoinColumn(name ="ticker_id"),
        inverseJoinColumns = @JoinColumn(name = "watching_id"))
  protected Set<Watching> watchings;

..

Tester

Account account;
AccountService accountService;
    Ticker ticker;
    Ticker tickerTwo;

  @Before
  public void setUp() throws Exception {
    account = ...
        ticker = ...;
      tickerTwo = ...;
    ....
    }

  @Test
  public void testSave() {

    Watching watching = account.getWatching();
    watching.getTickers().add(ticker);
    watching.getTickers().add(tickerTwo);


    Watching saved = accountService.save(account).getWatching();


    Ticker one = saved.getTickers().get(0);
    int size = saved.getTickers().size();
    assertEquals(2, size);
    Assert.assertEquals(one, tickerTwo); <-- fails
  }

标签: jpa

解决方案


请改用@OrderBy。@OrderColumn 按 ID 以外的不可见列对记录进行排序。

order 列作为实体或可嵌入类的状态的一部分不可见。

OrderBy 注释应该用于作为持久状态可见并由应用程序维护的排序。

https://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html


推荐阅读