当前位置: 首页 > 知识库问答 >
问题:

Ebean中的条件@OnetoMany关系

骆英纵
2023-03-14

我有一个parent实体,它与子实体有OneToMany关系。

我想在它们之间定义一个条件关系,其中child具有值为3的属性列字段attributechild表中的整数列,与模型中的相同:

@Constraints.Required
@NotNull
protected Integer attribute;

下面是我在实体类中尝试的:

@OneToMany(mappedBy = "parent")
@Where(clause = "attribute = 3")
List<Child> specificChildren;

但是,生成的查询忽略了我创建的where子句,并为我提供了与该父级相关的所有子级,而不仅仅是那些具有attribute=3的子级。将子句更改为${ta}。属性=3也未成功。

下面是SQL生成的查询。getGeneratedSql()

select distinct on (t1.attribute, t0.id) t0.id, t1.attribute
from parent t0
left join child t1 on t1.parent_id = t0.id
order by t1.someotherattribute

@where属性被完全忽略,因为无论我如何处理它,生成的SQL都不会受到影响。

有一个io.ebean.annotation.where类,所以看起来它应该可以工作,但是我没有在上面找到任何Ebean特定的留档(Ebean的文档似乎确实有些缺乏)。我找到的关于@where注释的大多数信息都与Hibernate有关。不过,我确实在这里找到了它的源代码。

这是否得到这样的支持?或者有没有其他方法可以做到这一点?

我目前正在使用PostgreSQL 10.4、Ebean 10.4.4、Play 2.6.7和Play的Ebean插件4.0.6。我尝试升级到Play的Ebean 4.1.3,但没有成功。不确定我使用的版本是否应该受到责备。

更多信息可在谷歌群组中找到。


共有1个答案

轩辕实
2023-03-14

这对我来说很有效,所以请允许我:

  1. 首先描述一下它在我这边的样子
  2. 然后就你方的问题提供一个假设
  3. 然后问一些澄清问题(以防需要进一步帮助)

我使用了Ebean 10.4.4和PostgreSQL 10(也适用于MySQL 6.7)。

>

@ManyToOne
@JoinColumn(name = "department_id")
private Department department;

protected int attribute;

Department类的主要部分,它是一个父实体实体:

@OneToMany(mappedBy = "department")
@Where(clause = "attribute = 3")
private List<Employee> employees = new ArrayList<Employee>();

查找查询

Query<Department> query = Ebean.find(Department.class).fetch("employees")
        .where().eq("name", "DevOps").query();
Department department = query.findUnique();
String queryString = query.getGeneratedSql();
System.out.println(queryString);

这里的重要部分是急切地获取“员工”字段。结果输出如下所示:

select t0.id, t0.name, t1.id, t1.name, t1.attribute_test, t1.department_id
from department t0
left join employee t1 on t1.department_id = t0.id
where attribute_test = 3 and t0.name = ?
order by t0.id

主要假设(因为我不知道您是如何查询/搜索实体的)是,您没有急切地获取实体,它们是使用单独的SQL获取的。

例如,在我上面的例子中,如果我将删除。获取(“员工”)部分,并将这样做:

Query<Department> query = Ebean.find(Department.class)
        .where().eq("name", "DevOps").query();
Department department = query.findUnique();
String queryString = query.getGeneratedSql();
System.out.println(queryString);
System.out.println(department); // uses this.employees in #toString() - so will lazily fetch child entities

我将:

>

  • 下面queryString的输出:

    select t0.id, t0.name from department t0 where t0.name = ?
    

    部门的下一个输出(我在部门中有两个员工具有属性=2和一个具有属性=3):

    Department [
      id=1,
      name=java,
      employees=[{Employee [id=3, name=Batman, attribute=3, department=DevOps]}]
    ]
    

    日志中有两个SQL查询(此处使用Logback),一个用于查找部门,另一个用于获取员工(使用@Where相关逻辑):

    08:09:35.038 [main] DEBUG io.ebean.SQL - txn[1001] select t0.id, t0.name from department t0 where t0.name = ? ; --bind(html" target="_blank">java)
    08:09:35.064 [main] DEBUG io.ebean.SQL - txn[1002] select t0.department_id, t0.id, t0.name, t0.attribute_test, t0.department_id from employee t0 where attribute_test = 3 and (t0.department_id) in (?) ; --bind(1)
    

    如果上述措施无法奏效,请提供下一步信息:

    >

    @ManyToOne是否用于实体端?

    请提供您的程序启动的SQL查询的日志好吗?

    这将足以为这个启用Logback,就像这里描述的那样

  •  类似资料:
    • 我有一出戏!使用ebean进行模型管理的框架项目。我有4个模型,A B C D. A和B是oneTo多,B和C是OneTo多,B和D是One To多。现在我想要一个与所有相关的B C D链接的A列表。 我现在拥有的是 但是性能非常差,根据sql日志,sql查询没有按照我的要求进行连接。是否有任何方法可以对所有这些对象使用查询联接?(即,选择包含4个查询的所有A B C D,并在本地连接它们,而不是

    • 我有一个具有唯一id UID的表条目。第二个表程序,ID列作为键,程序列表UID外键引用条目中的UID。我没有创建名称,这是我试图维护的遗留代码。 当试图保存条目时,我得到一个异常 ERROR执行DML bindLog[]错误[[SQL0121]重复的名称PROGRAM_LIST_UID不允许... 跟踪显示insert语句确实指定了两次: 我找到的唯一方法是从中删除。然而,此属性在代码的其他地方

    • 问题内容: 我有一个由以下映射的关联: 我想使用Criteria API返回所有包含一个或多个带有attribute实体的实体的列表。我不希望映射集合被查询过滤。 例如,给出以下内容: 该查询应返回以下内容: 到目前为止,我正在使用以下条件查询: 然而,它返回的等价于 即,它为每个子元素返回一个父记录(填充了子集合) 有谁知道在这种情况下如何仅返回唯一的父元素? 意见表示赞赏,p。 问题答案: 您

    • 我有三个班,站点,GoupIP和IP 一个站点有一个或多个抱怨。GroupIP有一个或多个IP。 代码如下: 地点 群居 IP 在GroupIp课堂上,我得到: 在属性“ips”中,“映射者”值“groupip”无法解析为目标实体上的属性。 我的代码出了什么问题??

    • OneTomany:Trplist:TargetEntity:TravelRoutePoints MappedBy:route Cascade:[“Persist”,“Remove”]JoinColumn:Name:id引用的ColumnName:tr_id

    • Ebean是一个使用纯Java实现的开源ORM框架。  Bean使用JPA注释(@entity,  @OneToMany等Java注释)对实体进行映射。Ebean力求让使用最简单的API帮助开发者从数据库获取有用的数据信息。 Ebean是一个对象/关系映射持久层框架。它与EJB3相类似,但该框架简单易于学习和使用。 主要特点: 1.兼容EJB3 ORM映射 2.支持级联保存和删除 3.支持懒加载