Jodd DbOomQuery 提示与集合
Jodd DbOomQuery hint with collection
我正在使用 Jodd DbOom 来管理我的查询,它真的很棒。但是现在我正面临一个没有记录的情况。
我有一个查询 returns 一个对象列表 (A),每个 A 都有一个对象列表 (B),每个 B 都与其他对象(C、D、E、 ETC)。问题是 class JoinHintResolver
没有在 B 对象上设置值 C、D、E。 B 对象在 A 对象上正确设置。
下面是重现错误的测试方法。其他用到的classes(Girl
,BadBoy
)来自Jodd测试包
public void testHintsList() {
Room room = new Room();
Girl girl = new Girl();
BadBoy badBoy = new BadBoy();
Object[] data = new Object[] { room, badBoy, girl };
JoinHintResolver jhr = new JoinHintResolver();
Object[] result = jhr.join(data, "room, room.boys, room.boys.girl");
assertEquals(1, result.length);
assertTrue(result[0] instanceof Room);
room = (Room) result[0];
badBoy = room.getBoys().get(0);
assertEquals(girl, badBoy.girl);
}
public class Room {
private Long id;
private List<BadBoy> boys;
public Room() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<BadBoy> getBoys() {
return boys;
}
public void setBoys(List<BadBoy> boys) {
this.boys = boys;
}
}
文档中没有这样的例子,Google也没有。所以我不知道是我做错了什么,还是乔德没有为这种情况做好准备。
如何设置提示以便 Jodd 正确设置值?
所以这里的问题是您的 Room
中有 BadBoy
的集合。提示:
room.boys.girl
建议他们将 Girl
实例注入 集合 。在java字里,这相当于:
getRoom().getBoys().setGirl(girl);
显然,由于getBoys()
returns一个List
,我们不能设置girl
属性.
要测试我所说的内容,请改用以下提示:
room.boys[0].girl
这会将 girl
实例注入到列表的第一个元素中。或者,您可以将 Room
更改为只有 Boy
属性,而不是列表,原始提示将起作用。
我希望这对你有用:)
(参见 test)
编辑
在 this branch 中,我有一些看起来像是修复的东西 :) 现在你可以这样写:
select $C{room.*}, $C{room.boys:boy.*}, $C{room.boys.girl:girl.*}
from $T{Room room} join $T{Boy4 boy} on $room.id=$boy.roomId
join $T{Girl4 girl} on $boy.id=$girl.boyId
order by $room.id, $boy.id
你可以拥有以下模型:
Room
有 Boy
个列表。每个 Boy
分配了一个 Girl
。当 entityAware
打开时,这应该可以工作。也许你有时间测试分支?
我正在使用 Jodd DbOom 来管理我的查询,它真的很棒。但是现在我正面临一个没有记录的情况。
我有一个查询 returns 一个对象列表 (A),每个 A 都有一个对象列表 (B),每个 B 都与其他对象(C、D、E、 ETC)。问题是 class JoinHintResolver
没有在 B 对象上设置值 C、D、E。 B 对象在 A 对象上正确设置。
下面是重现错误的测试方法。其他用到的classes(Girl
,BadBoy
)来自Jodd测试包
public void testHintsList() {
Room room = new Room();
Girl girl = new Girl();
BadBoy badBoy = new BadBoy();
Object[] data = new Object[] { room, badBoy, girl };
JoinHintResolver jhr = new JoinHintResolver();
Object[] result = jhr.join(data, "room, room.boys, room.boys.girl");
assertEquals(1, result.length);
assertTrue(result[0] instanceof Room);
room = (Room) result[0];
badBoy = room.getBoys().get(0);
assertEquals(girl, badBoy.girl);
}
public class Room {
private Long id;
private List<BadBoy> boys;
public Room() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<BadBoy> getBoys() {
return boys;
}
public void setBoys(List<BadBoy> boys) {
this.boys = boys;
}
}
文档中没有这样的例子,Google也没有。所以我不知道是我做错了什么,还是乔德没有为这种情况做好准备。
如何设置提示以便 Jodd 正确设置值?
所以这里的问题是您的 Room
中有 BadBoy
的集合。提示:
room.boys.girl
建议他们将 Girl
实例注入 集合 。在java字里,这相当于:
getRoom().getBoys().setGirl(girl);
显然,由于getBoys()
returns一个List
,我们不能设置girl
属性.
要测试我所说的内容,请改用以下提示:
room.boys[0].girl
这会将 girl
实例注入到列表的第一个元素中。或者,您可以将 Room
更改为只有 Boy
属性,而不是列表,原始提示将起作用。
我希望这对你有用:)
(参见 test)
编辑
在 this branch 中,我有一些看起来像是修复的东西 :) 现在你可以这样写:
select $C{room.*}, $C{room.boys:boy.*}, $C{room.boys.girl:girl.*}
from $T{Room room} join $T{Boy4 boy} on $room.id=$boy.roomId
join $T{Girl4 girl} on $boy.id=$girl.boyId
order by $room.id, $boy.id
你可以拥有以下模型:
Room
有 Boy
个列表。每个 Boy
分配了一个 Girl
。当 entityAware
打开时,这应该可以工作。也许你有时间测试分支?