尝试按crudrepository中的联接实体字段排序时出现spring数据错误

时间:2018-03-14 16:16:20

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

我在mysql中使用springboot和springdata。

我有2个实体,Customer&顺序:

@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对象时,sort对象是Customer的属性。

e.g。

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

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

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

您是否知道如何按联合实体的字段进行排序?

谢谢

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您收到错误,因为关系未正确建模。在您的情况下,它是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));