我有一个parent
实体,该实体与OneToMany
实体具有child
关系。
我想定义两者之间的条件关系,其中child
有一个attribute
列字段,其值为3。attribute
是child
中的整数列该表在模型中是这样的:
@Constraints.Required
@NotNull
protected Integer attribute;
这是我在parent
实体类中尝试的内容:
@OneToMany(mappedBy = "parent")
@Where(clause = "attribute = 3")
List<Child> specificChildren;
但是,生成的查询将忽略我所做的where子句,并为我提供与该父项相关的所有子项,而不仅仅是具有attribute = 3
的子项。将clause
更改为${ta}.attribute = 3
也不成功。
这是SQL生成的query.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有关。我确实找到了here的源代码。
是否以此方式支持?还是有另一种方法可以实现?
我目前正在使用PostgreSQL的Ebean插件4.0.6,使用PostgreSQL 10.4,Ebean 10.4.4,Play 2.6.7。我尝试更新到Play的Ebean 4.1.3,但未成功。不知道我使用的版本是否应受指责。
在Google网上论坛here中找到了更多信息。
答案 0 :(得分:1)
它对我有效,所以请让我:
我曾经使用过 Ebean 10.4.4 和 PostgreSQL 10 (也适用于 MySQL 6.7 )。
Employee 类的主要部分,它是一个child
实体:
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
protected int attribute;
部门类的主要部分,它是一个parent
实体:
@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);
这里的重要部分是急切地获取"employees"
字段。结果输出如下:
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
主要假设(因为我不知道您如何查询/搜索实体)是您没有急切地获取child
实体,而是使用单独的SQL来获取它们。
例如在上面的示例中,如果我将删除.fetch("employees")
部分并将这样做:
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 = ?
department
的下一个输出(部门中我有两名员工,attribute = 2
,另一名员工attribute = 3
):
Department [
id=1,
name=java,
employees=[{Employee [id=3, name=Batman, attribute=3, department=DevOps]}]
]
在日志中有2条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(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)
如果上述操作无效,请提供以下信息: