spring 使用 Distinct 启动时的查询没有 return 不同的值
Query in spring boot with Distinct doesn't return diffrent values
我有两个 classes Port 和 Person。一个人可以有多个端口,因此两个 classes 之间存在 ManyToOne 关系。我想 return Person 中存在的所有端口。
这是人 class:
@Entity
@Table(name = "person")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "age", nullable = false)
private String age;
@Column(name = "mdp")
private String mdp;
@ManyToOne
@JoinColumn(name = "puerto_id")
private Port port;
//getters & setters
这里是端口 class:
@Entity
@Table(name = "port")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Port implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "id")
private Long id;
@Column(name = "city")
private String city;
在 PortRepository.java 中我做了这个查询,我在 PortResource.java
中调用
@SuppressWarnings("unused")
@Repository
public interface PortRepository extends JpaRepository<Port, Long> {
@Query(value = "SELECT DISTINCT * FROM port t1 INNER JOIN person t2 ON t1.ID = t2.puerto_id", nativeQuery = true)
Page<Port> findPersonsPorts(Pageable pageable);
}
//
@GetMapping("/persons/ports")
public ResponseEntity<List<Port>> getPersonsPorts(@org.springdoc.api.annotations.ParameterObject Pageable pageable) {
log.debug("REST request to get a page of Ports");
Page<Port> page = portRepository.findPersonsPorts(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
return ResponseEntity.ok().headers(headers).body(page.getContent());
}
在邮递员上执行此 http://localhost:8080/api/people 我有以下响应:
[
{
"id": 2902,
"age": "88",
"mdp": null,
"port": null
},
{
"id": 3001,
"age": "45",
"mdp": "mdp",
"port": {
"id": 2952,
"city": "rabat"
}
},
{
"id": 3002,
"age": "88",
"mdp": "mdp",
"port": {
"id": 2952,
"city": "rabat"
}
} ]
并且当发送此请求 http://localhost:8080/api/persons/ports 时,我得到 duplicate Port
值
[
{
"id": 2952,
"city": "rabat"
},
{
"id": 2952,
"city": "rabat"
} ]
更新:
当我在 h2 数据库上执行相同的查询时:
SELECT DISTINCT * 来自 PORT t1 INNER JOIN PERSON t2 ON t2.puerto_id = t1.ID
我得到了这个 table,你可以看到行是不同的,因为它 return 在同一 table 人员和端口 table 的列中。我不确定这是否是问题所在
你的 DISTINCT
关键字不起作用,因为你的结果集不是真正唯一的,看看你的记录, ID
列有不同的数据,所以它们和 DISTINCT
帮不了你
如果您只想要 PORT table 数据,请尝试使用 t1.*
而不是 *
使用这个查询:
SELECT DISTINCT t1.* FROM PORT t1 INNER JOIN PERSON t2 ON t2.puerto_id = t1.ID
我有两个 classes Port 和 Person。一个人可以有多个端口,因此两个 classes 之间存在 ManyToOne 关系。我想 return Person 中存在的所有端口。 这是人 class:
@Entity
@Table(name = "person")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "age", nullable = false)
private String age;
@Column(name = "mdp")
private String mdp;
@ManyToOne
@JoinColumn(name = "puerto_id")
private Port port;
//getters & setters
这里是端口 class:
@Entity
@Table(name = "port")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Port implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "id")
private Long id;
@Column(name = "city")
private String city;
在 PortRepository.java 中我做了这个查询,我在 PortResource.java
中调用@SuppressWarnings("unused")
@Repository
public interface PortRepository extends JpaRepository<Port, Long> {
@Query(value = "SELECT DISTINCT * FROM port t1 INNER JOIN person t2 ON t1.ID = t2.puerto_id", nativeQuery = true)
Page<Port> findPersonsPorts(Pageable pageable);
}
//
@GetMapping("/persons/ports")
public ResponseEntity<List<Port>> getPersonsPorts(@org.springdoc.api.annotations.ParameterObject Pageable pageable) {
log.debug("REST request to get a page of Ports");
Page<Port> page = portRepository.findPersonsPorts(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
return ResponseEntity.ok().headers(headers).body(page.getContent());
}
在邮递员上执行此 http://localhost:8080/api/people 我有以下响应:
[
{
"id": 2902,
"age": "88",
"mdp": null,
"port": null
},
{
"id": 3001,
"age": "45",
"mdp": "mdp",
"port": {
"id": 2952,
"city": "rabat"
}
},
{
"id": 3002,
"age": "88",
"mdp": "mdp",
"port": {
"id": 2952,
"city": "rabat"
}
} ]
并且当发送此请求 http://localhost:8080/api/persons/ports 时,我得到 duplicate Port
值[
{
"id": 2952,
"city": "rabat"
},
{
"id": 2952,
"city": "rabat"
} ]
更新:
当我在 h2 数据库上执行相同的查询时: SELECT DISTINCT * 来自 PORT t1 INNER JOIN PERSON t2 ON t2.puerto_id = t1.ID
我得到了这个 table,你可以看到行是不同的,因为它 return 在同一 table 人员和端口 table 的列中。我不确定这是否是问题所在
你的 DISTINCT
关键字不起作用,因为你的结果集不是真正唯一的,看看你的记录, ID
列有不同的数据,所以它们和 DISTINCT
帮不了你
如果您只想要 PORT table 数据,请尝试使用 t1.*
而不是 *
使用这个查询:
SELECT DISTINCT t1.* FROM PORT t1 INNER JOIN PERSON t2 ON t2.puerto_id = t1.ID