我使用JDBI創建了一個簡單的REST應用程序和dropwizard。下一步是整合一個與另一個具有一對多關係的新資源。直到現在我都無法弄清楚如何在我的DAO中創建一個方法來檢索一個包含另一個表中對象列表的對象。如何使用JDBI SQL對象API創建一對多關係?
的POJO的描述是這樣的:
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Account {
private int id;
private String name;
private List<User> users;
public Account(int id, String name, List<User> users) {
this.id = id;
this.name = name;
this.users = users;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return name;
}
public void setUsers(List<Users> users) {
this.users = users;
}
}
的DAO應該是這個樣子
public interface AccountDAO {
@Mapper(AccountMapper.class)
@SqlQuery("SELECT Account.id, Account.name, User.name as u_name FROM Account LEFT JOIN User ON User.accountId = Account.id WHERE Account.id = :id")
public Account getAccountById(@Bind("id") int id);
}
但當方法有一個對象作爲返回值(帳戶代替列表<帳戶>)似乎無法訪問Mapper類中resultSet的多行。我能找到的唯一解決方案是在https://groups.google.com/d/msg/jdbi/4e4EP-gVwEQ/02CRStgYGtgJ中描述的,但那個解決方案也只能返回一個Set,其中有一個看起來不太優雅的對象。 (並且不能被資源類正確使用。)
似乎有一種方法在流利的API中使用了Folder2。但我不知道如何正確地將它與dropwizard集成在一起,而且我更願意按照dropwizard文檔中的建議堅持JDBI的SQL對象API。
真的沒有辦法在JDBI中使用SQL對象API獲得一對多映射嗎?對於一個數據庫來說,這是一個基本的用例,我認爲我必須錯過一些東西。
所有幫助是極大的讚賞,
蒂爾曼
您可以通過簡單地將其抽象爲第一個選項移動到DAO類。看到這個答案:http://stackoverflow.com/a/26831146/846644 – Natan
這是一個非常好的mapper技巧!我在DAO方法中添加了一個註釋和一個解決列表/非列表返回類型的方法,因爲它引起了我的不安。 –
這裏值得注意的是,第二個選項可能根本不是線程安全的(由於父母Account對象),除非您知道JDBI每次執行查詢時都使用此ResultSetMapper的新實例,我真的不知道,但仍然認爲依賴脆弱的假設。 – Hesham