[英]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.