【问题标题】:spring data error when trying to sort by a field of joined entity inside a crudrepository尝试按 crudrepository 中连接实体的字段进行排序时出现弹簧数据错误
【发布时间】:2018-08-23 06:42:25
【问题描述】:

我在 Mysql 中使用 springboot 和 springdata。

我有 2 个实体,客户和订单:

@Entity
@Table(name = "customers")
public class Customer {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id", nullable = false)
    protected long id;

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

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id", nullable = false)
    protected long id;

    @Column(name="customer_id")
    private long customerId;
}

我也有一个仓库:

@Repository
public interface OrdersRepository extends JpaRepository<Order, Long> {

    @Query("select o from Order o, Customer c where o.customerId = c.id")
    Page<Order> searchOrders(final Pageable pageable);
}

该方法有更多用于搜索的参数,但问题是当我发送一个 PageRequest 对象时,排序是 Customer 的一个属性。

例如

Sort sort = new Sort(Sort.Direction.ASC, "c.name");
ordersRepository.search(new PageRequest(x, y, sort));

但是,按 Order 字段排序效果很好:

Sort sort = new Sort(Sort.Direction.ASC, "id");
ordersRepository.search(new PageRequest(x, y, sort));

我得到的错误是 c 不是 Order 的属性(但由于查询是实体的连接,我希望它可以工作)。

Caused by: org.hibernate.QueryException: could not resolve property c of Order

您知道如何按连接实体的字段进行排序吗?

谢谢

【问题讨论】:

    标签: jpa spring-boot spring-data spring-data-jpa


    【解决方案1】:

    您收到错误是因为未正确建模关系。在您的情况下,它是 ManyToOne 关系。我可以推荐wikibooks 进一步阅读。

    @Entity
    @Table(name = "orders")
    public class Order {
    
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id", nullable = false)
        protected long id;
    
        @ManyToOne
        @JoinColumn(name="customer_id", referencedColumnName = "id")
        private Customer customer;
    }
    

    不再需要查询,因为将获取客户。

    @Repository
    public interface OrdersRepository extends PagingAndSortingRepository<Order, Long> {
    }
    

    现在您可以使用嵌套属性。

    Sort sort = new Sort(Sort.Direction.ASC, "customer.name");
    ordersRepository.findAll(new PageRequest(x, y, sort));
    

    【讨论】:

      【解决方案2】:

      在 JPA 中,您排序的东西必须是在 select 语句中返回的东西,您不能使用未返回的属性进行排序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-05
        • 1970-01-01
        • 2020-10-04
        • 2014-08-31
        • 2017-11-05
        相关资源
        最近更新 更多