Ebean中的条件@OnetoMany关系

时间:2018-08-15 00:48:12

标签: java postgresql jpa one-to-many ebean

我有一个parent实体,该实体与OneToMany实体具有child关系。

我想定义两者之间的条件关系,其中child有一个attribute列字段,其值为3。attributechild中的整数列该表在模型中是这样的:

@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中找到了更多信息。

1 个答案:

答案 0 :(得分:1)

它对我有效,所以请让我:

  1. 首先描述它在我这边的样子
  2. 然后为您提供有关该问题的假设
  3. 然后提出一些澄清问题(如果需要进一步的帮助)

工作解决方案

我曾经使用过 Ebean 10.4.4 PostgreSQL 10 (也适用于 MySQL 6.7 )。

  1. Employee 类的主要部分,它是一个child实体:

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    
    protected int attribute;
    
  2. 部门类的主要部分,它是一个parent实体:

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

    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)
    

澄清问题

如果上述操作无效,请提供以下信息:

  1. 正在使用哪个版本的PostgreSQL?

  2. @ManyToOne实体侧是否使用过child

  3. 能否请您提供由程序启动的SQL查询的日志?

    启用{em> Logback 就足够了,就像here >>所述:只需添加依赖项并利用this >>配置文件。

    < / li>