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