簡體   English   中英

在 SQL 或 JPQL 中查詢以獲取單向關系一對多

[英]Query in SQL or JPQL to fetch unidirectional relationship One-To-Many

我正在為我工作的公司構建一個 API,這是我第一次使用 Spring Boot,所以我有一些疑問。 所以我有一個一對多的單向關系,從我的父母 class(公司)到我的孩子 class(辦公室)。 問題是我不知道如何查詢屬於 Compania object 的 Office 對象。 我認為這應該是一個簡單的解決方案,但我無法找到它。

Hibernate 為我創建了一個名為 COMPANIA_OFFICE 的額外表,我不知道如何將它與 SQL 或 JPQL 查詢一起使用。 所以現在在我的數據庫中,我有一個名為 COMPANIA 的表,另一個名為 OFFICE,最后一個名為 COMPANIA_OFFICE(這個包含 COMPANIA_ID 和 OFFICE_ID,因為我在它使用的兩個類中都沒有 FK輔助表加入他們,我想)。

我想要實現的是像這樣的 GET 請求:

GET /companias/{companiaId}/office/{officeName} -> 返回一個列表,其中包含來自指定公司的具有該名稱的辦公室的 id

我現在的課程是:

公司

@Entity(name = "Compania")
    @Table(
        name = "compania"
    )
    public class Compania {
        @Id
        @SequenceGenerator(
            name = "compania_sequence",
            sequenceName = "compania_sequence",
            allocationSize = 1
        )
        @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "compania_sequence"
        )
        @Column(
            nullable = false
        )
        private Long id;
    
        @Column(
            name = "name",
            nullable = false,
            unique = true
        )
        private String name;
    
        @OneToMany(
            mappedBy = "compania",
            cascade = CascadeType.ALL,
            fetch = FetchType.LAZY,
            orphanRemoval = true
        )
        private List<Office> office;

    ...Constructors...
    ... Getters and Setters...

辦公室(兒童)

@Entity()
@Table()
public class Office {
    @Id
    @SequenceGenerator(
        name = "office_sequence",
        sequenceName = "office_sequence",
        allocationSize = 1
    )
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "office_sequence"
    )
    @Column(
        nullable = false
    )
    @JsonIgnore
    private Long id;

    @Column(
        name = "idRef",
        nullable = false
    )
    private int idRef;

    @Column(
        name = "title",
        nullable = false
    )
    private String title;

    @Column(
        name = "name"
    )
    private String name;

    ...Constructors...
    ... Getters and Setters...

所以我的問題是我不知道如何在 spring Boot 中進行該查詢。 如果直接使用 SQL 或 JPQL,我不會。

提前致謝!

編輯。 我試過使用這樣的本機查詢:

@Query(
        value = "select o.* from office o " +
            "inner join compania_office co on o.id = co.office_id " +
            "inner join compania c on c.id = co.compania_id " +
            "where c.id = :companiaId and lower(o.title) like lower(:officeTitle) " +
            "order by o.id_ref asc;",
        nativeQuery = true
    )
    List<Office> findOfficesByTitleLike(@Param("companiaId")Long companiaId,@Param("officeTitle") String officeTitle);

當我使用像 Navicat 這樣的數據庫管理器或嵌入在 IntelliJ 中的數據庫管理器執行常見查詢時,它可以工作。 但是當我嘗試將它與我的 API 一起使用時,它給了我這個錯誤:

org.springframework.dao.InvalidDataAccessResourceUsageException:無法提取結果集; SQL [不適用]; 嵌套異常是 org.hibernate.exception.SQLGrammarException:無法提取 ResultSet

你知道會發生什么嗎? 謝謝!

最近我有一個類似的問題。 我使用 JDBC 模板管理它從兩個實體/表中獲取數據。 但是,首先我創建了一個 class ,其中僅包含我需要的列。 以下是我的解決方案和對您問題的建議:

    @GetMapping("/testi2")
public List<CustomerResponse> getCCP2() {
    String sql = "SELECT top 20 c.ID, c.CustomerNumber, c.Name, c.Surname, c.Area, c.City, c.Address, c.PhoneNumber, c.CustomerTypeID, c.Enabled, c.DateCreated, p.Id, p.Debit, p.Credit\n" +
            "FROM TblCustomer c OUTER APPLY\n" +
            "     (SELECT TOP 1 p.*\n" +
            "      FROM TblPayments p\n" +
            "      WHERE c.CustomerNumber = p.CustomerNumber\n" +
            "      ORDER BY p.id DESC \n" +
            "     ) p;";
    List<CustomerResponse> result = jdbcTemplate.query(
            sql,
            new BeanPropertyRowMapper(CustomerResponse.class));

    return result;
}

其中 class <CustomerResponse>持有“ID, CustomerNumber, Name, Surname, Area, City, Address, PhoneNumber, CustomerTypeID, Enabled, c.DateCreated, Id, Debit, Credit”。

我不知道這是否是你的問題,但我最近遇到了類似的問題,字符串參數:officeTitle在你的情況下,它沒有作為':officeTitle' (SQL varchar) 傳遞給 sql,所以我已經解決了它將參數轉換為 varchar(255)。

...  like lower(cast(:officeTitle AS varchar(255)))

我認為 nativeQuery 不會自動轉換參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM