【问题标题】:Spring Data JPA Repository Method Query Cannot Parse Property Name Following OrderBySpring Data JPA 存储库方法查询无法解析 OrderBy 之后的属性名称
【发布时间】:2019-08-20 19:42:02
【问题描述】:

我的存储库方法查询无法解析 OrderBy 之后的属性名称,但如果它跟随 findByfindAllBy 则可以。我的实体中给我带来问题的属性是zIndex

实体类

@Entity
public class DisplayLayer 
{
  @Id
  @Column(name="DISPLAY_LAYER_ID")
  private Long id;

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="DISPLAY_CONTAINER_ID")
  private DisplayContainer displayContainer;

  @Column(name="NAME")
  private String name;

  @Column(name="Z_INDEX")
  private Long zIndex;

  @Column(name="DESCRIPTION")
  private String description;

  // Getters & Setters
}

存储库类

public interface DisplayLayerRepository extends BaseRepository<DisplayLayer, Long>
{
  // This one method query works just fine
  public List<DisplayLayer> findByZIndex(Long pZIndex);

  // These two throw the same error:
  // Unable to locate Attribute  with the the given name [ZIndex]
  //
  // public List<DisplayLayer> findAllByOrderByZIndexAsc();
  // public List<DisplayLayer> findByDisplayContainerIdOrderByZIndexAsc(Long pDisplayLayerId);
}

所以在我的第一个方法查询中,当 OrderBy 没有被使用时,它会正确地将其解析为 [zIndex],但是当它出于某种原因跟随 OrderBy 时,它会将 z 大写:[ZIndex]

这是一个已知问题,还是我做错了什么?

编辑 让我认为解析器可能存在错误的原因是,如果我将实体中的zIndex 更新为IndexZ,然后将我的查询方法从OrderByZIndex 更改为OrderByIndexZ,一切正常。

这个解决方案并不理想,因为数据库表是Z_INDEX,并且在谈论图形分层时具有特定含义。

【问题讨论】:

  • 这与hibernate使用的一些命名策略有关。您可以查看各种命名策略以选择强制列名。

标签: spring hibernate jpa spring-data-jpa spring-data


【解决方案1】:

是的,有一个错误,但有一个简单的解决方法,请尝试:

displayLayerRepository.findAll(Sort.by(Sort.Order.desc("zIndex").ignoreCase()));

我想 DisplayLayerRepository 扩展了 JpaRepository。

在 findBy 方法中使用参数时也是如此。在您的存储库中定义空方法:

public List<DisplayLayer> findByDisplayContainerId(Long pDisplayLayerId, Sort sort);

然后你可以调用它:

displayLayerRepository.findByDisplayContainerId(1L, Sort.by(Sort.Order.desc("zIndex").ignoreCase()));

【讨论】:

  • 我将不得不对此进行更多研究,因为我还需要能够限制它,即,而不是 findAll findByDisplayContainerId。更重要的是,报告此错误的正确位置在哪里?在解决之前,我不介意使用我的解决方法。
  • 我完成了我的答案,可以用同样的方式。
【解决方案2】:

您可以在查询中使用 JpaSort。与您的情况一样,它看起来像这样:

Sort sort = JpaSort.unsafe(Sort.Direction.ASC, "zIndex");

List<DisplayLayer> zIndexes = displayLayerRepository.findByZIndex(pZIndex, sort);

您在存储库中的查询将如下所示:

public List<DisplayLayer> findByZIndex(Long pZIndex, Sort sort);

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 2015-07-11
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2017-08-20
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多