在Java EE项目中使用ActiveJDBC从Records集合获取关联Artist的问题
解决ActiveJDBC中Records关联Artists的查询问题
嗨,我刚好在自己的Java EE小项目里折腾过ActiveJDBC的关联查询,给你分享下怎么快速搞定Records关联Artists的需求!
首先咱们先确认下模型类的基础设置:你的Artists和Records类都得继承ActiveJDBC的Model类,而且默认情况下,只要你的Records表里的外键字段是artist_id(对应Artists表的主键id),ActiveJDBC会自动识别这层1:n的关联关系,不用额外写注解。要是外键字段名不是默认的(比如叫artist_fk),那就在Record类里加个注解指定下:
@BelongsTo(parent = Artist.class, foreignKeyName = "artist_fk") public class Record extends Model {}
接下来分两种场景处理你的需求:
场景1:已经拿到Records对象列表,逐个获取关联的Artist
如果你已经通过比如Record.findAll()拿到了所有Record对象,直接给每个Record调用parent(Artist.class)就能拿到对应的Artist对象,代码示例如下:
// 在Servlet中获取Records列表 List<Record> records = Record.findAll(); // 遍历每个Record,获取关联的Artist for (Record record : records) { Artist artist = record.parent(Artist.class); // 这里就可以操作Artist的属性了,比如获取艺术家名称 String artistName = artist.getString("name"); String recordTitle = record.getString("title"); System.out.printf("专辑《%s》的艺术家是:%s%n", recordTitle, artistName); }
场景2:优化查询,避免N+1问题
上面的写法如果Records数量多的话,会触发N+1次SQL查询(1次查所有Records,N次查每个对应的Artist)。想要优化的话,用include()方法预加载关联的Artist数据,一次SQL查询就搞定所有数据:
// 预加载Artist关联数据,只发一次SQL List<Record> records = Record.findAll().include(Artist.class); for (Record record : records) { // 这里调用parent()不会再发SQL,因为数据已经预加载好了 Artist artist = record.parent(Artist.class); // 后续操作和之前一样 }
另外补充个反向查询的小技巧:如果以后需要从某个Artist对象获取它所有的Records,直接调用artist.getAll(Record.class)就可以啦~
内容的提问来源于stack exchange,提问作者derelektrischemoench
相关产品推荐
相关产品推荐

