我正在為我工??作的公司構建 API,這是我第一次使用 Spring Boot,所以我有一些疑問。所以我有一個一對多的單向關系,從我的父類(Compania)到我的子類(Office)。問題是我不知道如何查詢屬于 Compania 物件的 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
你知道會發生什么嗎?謝謝!
uj5u.com熱心網友回復:
最近我遇到了類似的問題。我使用 JDBC 模板管理它從兩個物體/表中獲取資料。但是,首先我創建了一個類,其中僅包含我需要的列。以下是我的解決方案和對您的問題的建議:
@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”。
uj5u.com熱心網友回復:
我不知道這是否是你的問題,但我最近遇到了類似的問題,字串引數,:officeTitle在你的情況下,它沒有作為':officeTitle'(SQL varchar)傳遞給 sql,所以我已經解決了將引數轉換為 varchar 的問題(255)。
... like lower(cast(:officeTitle AS varchar(255)))
我認為 nativeQuery 不會自動轉換引數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359613.html
上一篇:如何結合兩個媒體查詢?
