Java Hibernate:示例查询和多对一关系

Java Hibernate:示例查询和多对一关系,java,hibernate,jpa,many-to-one,query-by-example,Java,Hibernate,Jpa,Many To One,Query By Example,假设这些是我的实体: 表1.java 表2.java 表3.java 我想列出所有Table1行,它们的table2.table3.lang等于en。我尝试通过示例使用查询: Table3 table3Example = new Table3(); table3Example.setLang("en"); Table2 table2Example = new Table2(); table2Example.setTable3(table3Example); Table1 table1Exam

假设这些是我的实体:

表1.java

表2.java

表3.java

我想列出所有
Table1
行,它们的
table2.table3.lang
等于
en
。我尝试通过示例使用查询:

Table3 table3Example = new Table3();
table3Example.setLang("en");

Table2 table2Example = new Table2();
table2Example.setTable3(table3Example);

Table1 table1Example = new Table1();
table1Example.setTable2(table2Example);

table1Repository.findByExample(table1Example);
问题是
.findByExample(table1Example)
返回数据库的所有行,不管
语言是什么,这意味着根本不考虑过滤器
:(

任何帮助都将不胜感激。
:)


PS:不会引发异常,
.findByExample(table1Example)
只返回所有
Table1
行。

尝试以下操作:

    Query q = entityManager.createQuery("Select o from Table1 o where o.table2.table3.lang = :lang");
    q.setParameter("lang", "en");
    List<Table1> r = (List<Table1>)q.getResultList();
Query q=entityManager.createQuery(“从表1中选择o,其中o.table2.table3.lang=:lang”);
q、 设置参数(“lang”、“en”);
List r=(List)q.getResultList();
要了解为什么会得到表1中的所有行,请确保

<property name="hibernate.show_sql" value="true"/>


在您的
persistence.xml中,然后查看日志以查看hibernate执行的实际选择。

非常有效!但这意味着我必须自己实现所有我想要的过滤器。如果一个示例查询能够自己完成多对一链接,那就太好了。难道不可能吗?无论如何,谢谢:)据我所知,示例查询和多对一关系存在一些问题。识别运行findByExample时发生的情况的最佳方法是查看日志并查看实际执行的select hibernate。事实上,在我的
.findByExample
方法(这是一个)中,有一个
如果(attr.getPersistentAttributeType()=多对多)继续。当我注释该行时,我捕捉到一个异常:
对象引用了一个未保存的瞬态实例
,这是可以理解的,因为对象是示例,而不是真正的持久化实体。但是,是的,这似乎是一个不足,通过示例查询有改进的余地
:)
无论如何,谢谢你,我给你800+!
Table3 table3Example = new Table3();
table3Example.setLang("en");

Table2 table2Example = new Table2();
table2Example.setTable3(table3Example);

Table1 table1Example = new Table1();
table1Example.setTable2(table2Example);

table1Repository.findByExample(table1Example);
    Query q = entityManager.createQuery("Select o from Table1 o where o.table2.table3.lang = :lang");
    q.setParameter("lang", "en");
    List<Table1> r = (List<Table1>)q.getResultList();
<property name="hibernate.show_sql" value="true"/>