【问题标题】:How to sort by pagerequest with inner join如何使用内部连接按页面请求排序
【发布时间】:2019-09-09 16:10:17
【问题描述】:

我有两张多对一的桌子。我想按请求参数定义的 ASC 或 DESC 方向的“地址”表中的“街道”列对“用户”表中的数据进行排序:

localhost:8080/getUsers?sort=address,desc

当我执行 sql 脚本时:

SELECT * FROM user INNER JOIN address ON user.address_id=address.id ORDER BY street DESC

在工作台或 phpMyAdmin 中效果很好。所有数据均按街道名称排序;

但是当我尝试通过以下方式在邮递员中获取它时:

getUsers?sort=address,desc

我在控制台输出中有这个错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'INNER.address' in 'order clause'

问题出在哪里?

@Table(name = "user")
public class User {
    private Long id;
    private String name;
    @ManyToOne()
    @JoinColumn(name = "address_id")
    private Address address;
}

@Table(name = "address")
public class Address {
    private Long id;
    private String street
    @OneToMany(mappedBy = "address")
    private List<User> user;
}

public interface UserRepository extends JpaRepository<User, Long> {

     @Query(value = "SELECT * FROM user INNER JOIN address ON user.address_id=address.id",
        countQuery = "SELECT * FROM contact_messages INNER JOIN contact_topics ON contact_messages.contact_topic_id=contact_topics.id",
        nativeQuery = true)
     Page<User> findAll(Pageable pageable); 
}

当我像这样在存储库中编写查询时,它的效果与在工作台中一样好:

@Query(value = "SELECT * FROM user INNER JOIN address ON user.address_id=address.id ORDER BY address DESC",
        countQuery = "SELECT * FROM contact_messages INNER JOIN contact_topics ON contact_messages.contact_topic_id=contact_topics.id ORDER BY address DESC",
        nativeQuery = true)

但我想在需要时控制请求和排序数据(使用排序参数)。

【问题讨论】:

标签: java sql spring jpa


【解决方案1】:

尝试将 SQL 替换为 SELECT u, a FROM user u INNER JOIN u.address a ORDER BY street DESC

【讨论】:

  • Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode \-[IDENT] IdentNode: 'u' {originalText=u}
  • 这个有效:SELECT u FROM user u INNER JOIN u.address a ORDER BY street DESC 是否有可能添加where address like '%:param%;到这个 HQL ?
  • SELECT u, a.street FROM user u INNER JOIN u.address a WHERE a.street LIKE CONCAT('%',:param,'%')") ORDER BY a.street跨度>
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 2022-08-05
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多