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

时间:2012-06-06 08:50:39

标签: java hibernate jpa many-to-one query-by-example

让我们说这些是我的实体:

Table1.java

@Entity
public class Table1 {

    // Many to one
    private Table2 table2;

    // Raw attributes
    // ...

}

Table2.java

@Entity
public class Table2 {

    // Many to one
    private Table3 table3;

    // Raw attributes
    // ...

}

Table3.java

@Entity
public class Table3 {

    // Raw attributes
    private String lang; // "fr", "en", "de"...

}

我想列出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)会返回数据库的所有行,无论lang是什么,这意味着根本不考虑过滤器:(

任何帮助都将受到赞赏:)

PS:没有抛出异常,.findByExample(table1Example)只返回所有Table1行。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

    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();

要了解为什么获得Table1中的所有行,请确保您拥有

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

persistence.xml中,然后观察日志以查看休眠执行的实际选择。