Spring Data JPA存储库方法查询无法按OrderBy解析属性名称

时间:2019-08-20 19:42:02

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

我的存储库方法查询无法解析在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:{ {1}}。

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

编辑 使我认为解析器可能存在错误的是,如果我将实体中的[ZIndex]更新为zIndex,然后将查询方法从IndexZ更改为OrderByZIndex有效。

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

2 个答案:

答案 0 :(得分:2)

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

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()));

答案 1 :(得分:1)

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

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

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

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

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