我有一个parent
实体,它与子实体有
OneToMany
关系。
我想在它们之间定义一个条件关系,其中
child
具有值为3的属性
列字段attribute
是child
表中的整数列,与模型中的相同:
@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,但没有成功。不确定我使用的版本是否应该受到责备。
更多信息可在谷歌群组中找到。
这对我来说很有效,所以请允许我:
我使用了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.支持懒加载