【问题标题】:Jodd DbOomQuery hint with collection带有集合的 Jodd DbOomQuery 提示
【发布时间】:2015-09-18 19:34:57
【问题描述】:

我正在使用Jodd DbOom 来管理我的查询,这真的很棒。但现在我正面临一个无证的情况。

我有一个返回对象列表(A)的查询,每个 A 都有一个对象列表(B),每个 B 都与其他对象(C、D、E 等)连接。问题是JoinHintResolver 类没有在 B 对象上设置值 C、D、E。 B 对象在 A 对象上设置正确。

以下是重现错误的测试方法。其他使用的类(GirlBadBoy)来自 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;
    }
}

文档没有这样的例子,谷歌也没有。所以我不知道是我做错了什么,还是乔德没有为这种情况做好准备。

如何设置提示以便 Jodd 正确设置值?

【问题讨论】:

  • 好问题!今天我会试着做一个测试用例给你回答。敬请期待!

标签: java jodd


【解决方案1】:

所以这里的问题是你的BadBoys 集合在你的Room 中。以及提示:

room.boys.girl

建议他们将Girl 实例注入集合。用java的话来说,这相当于:

getRoom().getBoys().setGirl(girl);

显然,由于getBoys() 返回一个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

你可以有以下模型:

RoomBoy 的列表。每个Boy 分配一个Girl。当entityAware 打开时,这应该可以工作。也许你有时间测试一下分支?

【讨论】:

  • 问题是我的模型有一个从 Room 到 BadBoy 的 一对多 关系和另一个从 BadBoy 到 Girl 的 一对多 关系。所以,你的建议对我不起作用。但是如果提示room.boys[0].girl 有效,那么使room.boys[CURRENT].girl 有效可能会很容易。 CURRENT 表示当前行正在填充的对象的索引。
  • 是的,明白了;让我分析一下我们能做些什么:)
  • 但是现在这个问题的答案是:乔德还没有为此做好准备——还没有!感谢您提供这个很棒的示例!
  • 嘿@EduardoEdington 你能把你的数据库模式的大纲发给我吗(比如哪个实体引用了另一个?)请将它发送到jodd.org 的支持人员-以便重新创建并更正它。
  • 嘿@EduardoEdington 也许你可以测试分支?查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多