我在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
您是否知道如何按联合实体的字段进行排序?
谢谢
答案 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));