Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Ebean中的条件@OnetoMany关系_Java_Postgresql_Jpa_One To Many_Ebean - Fatal编程技术网

Java Ebean中的条件@OnetoMany关系

Java Ebean中的条件@OnetoMany关系,java,postgresql,jpa,one-to-many,ebean,Java,Postgresql,Jpa,One To Many,Ebean,我有一个parent实体,它与子实体有OneToMany关系 我想在它们之间定义一个条件关系,其中child具有值为3的属性列字段attribute是child表中的整数列,与模型中的相同: @Constraints.Required @NotNull protected Integer attribute; 以下是我在父类中尝试的内容: @OneToMany(mappedBy = "parent") @Where(clause = "attribute = 3") List<Child

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

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

@Constraints.Required
@NotNull
protected Integer attribute;
以下是我在
父类中尝试的内容:

@OneToMany(mappedBy = "parent")
@Where(clause = "attribute = 3")
List<Child> specificChildren;
@Where
属性被完全忽略,因为无论我如何处理它,生成的SQL都不会受到影响

这里有一个
io.ebean.annotation.Where
类,所以它看起来应该可以工作,但我还没有找到任何关于它的ebean特定文档(ebean的文档确实似乎有点缺乏)。我找到的有关
@的大部分信息,其中
注释与Hibernate有关。不过我确实找到了它的源代码

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

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


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

这对我很有效,请允许我:

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

  • 工作溶液 我使用了ebean10.4.4和postgresql10(也适用于MySQL 6.7)

  • Employee类的主要部分,它是一个子实体:

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    
    protected int attribute;
    
    @OneToMany(mappedBy = "department")
    @Where(clause = "attribute = 3")
    private List<Employee> employees = new ArrayList<Employee>();
    
  • Department类的主要部分,它是一个
    父实体
    实体:

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    
    protected int attribute;
    
    @OneToMany(mappedBy = "department")
    @Where(clause = "attribute = 3")
    private List<Employee> employees = new ArrayList<Employee>();
    

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

    例如,在我上面的示例中,如果我将删除
    .fetch(“员工”)
    部分,并将这样做:

    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
    
  • 部门的下一个输出
    (我在该部门有两名员工的
    属性为2
    ,一名员工的
    属性为3
    ):

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


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

  • 正在使用哪个版本的PostgreSQL

  • @ManyToOne
    是否用于
    子实体侧

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

    这就足够像上面所描述的那样启用回登录了:只需要添加依赖项并利用配置文件


  • attribute
    是数据库中的确切列名,也是
    子实体上映射字段的名称吗?@SteveChambers,这是正确的。更新了帖子,介绍了它在
    子项中的定义。这似乎解决了我的大多数问题,鉴于查询中的fetch,现在肯定使用了
    @Where
    子句。在我发布这篇文章之前,我已经试着将我的一对多注释如下:
    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“parent”)
    。这不也是一回事吗?(我想我可能在某个地方读到Play的Ebean不支持它,不确定这是不是真的。)我的另一个问题是,如果添加了
    .fetch(“child”)
    ,我添加到查询中的任何orderBy表达式都将不受尊重,因为生成的sql将添加
    orderBy t0.id
    (t0是父表)。我通过使用fetch语句
    .fetch(“child”,new FetchConfig().query())
    将其拆分为两个查询,但最终仍然将所有内容合并在一起。这是正确的方法吗?@DavisMariotti,您这边的
    ORDER BY
    使用哪种方法?如果您要执行
    Ebean.find(Department.class).fetch(“employees”).orderBy(“attribute”).where().eq(“name”,“java”).query()它将在一次查询中提取和订购,您能试试吗?与“FetchConfig”相关的内容-它的目的是在单独的查询中执行fetch,因此这是一种可能性,但我更希望自己执行一个查询。@Davidsmariotti,Ebean仅部分支持JPA,对吗<几年前,
    @manytomy
    肯定不支持code>FetchType.EAGER
    。与
    @OneToMany
    FetchType有关的内容。EAGER
    -如果没有
    fetch
    ,昨天在我这方面也不起作用。不确定是什么造成了这种情况,但一旦我将其实现到我的实际代码中(而不是我进行的测试),排序问题就消失了,一切正常。但是现在,如果我在查询中使用
    setFirstRow()
    setmaxrrows
    ,它会将它们分成两个查询,这实际上破坏了顺序。如果删除这两个表达式,查询将创建为一个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
    
    select t0.id, t0.name from department t0 where t0.name = ?
    
    Department [
      id=1,
      name=java,
      employees=[{Employee [id=3, name=Batman, attribute=3, department=DevOps]}]
    ]
    
    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)