将简单的SQL查询转换为JPA ... OneToMany关系

时间:2014-06-30 09:07:46

标签: sql hibernate jpa orm jpa-2.0

我有一个JPA(Hibernate)模型......一个对象包含一个其他对象的列表。如果我想运行一个SQL查询来搜索BOTH对象它是相对简单的,我做一个LEFT JOIN并在所有列上做一个简单的LIKE %searchString%

SELECT * FROM my_db.person LEFT JOIN my_db.record ON record.person_pk WHERE .... ; 

我无法将其转换为JPA样式查询..模型就像这样

@Access(AccessType.FIELD)
@Entity
@Table(name = "person")
public class Person {

    @Column(nullable = true)
    private String name;
    @Column(nullable = true)
    private String address;

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="debtor")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Record> records = new LinkedList<>();

...
...

The matching ManyToOne

@Entity
@Table(name = "record")
public class Record implements Serializable {

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name="person_pk")
    private Person person;

    @Column(nullable = true)
    private String factor1;
    @Column(nullable = true)
    private String factor2;

我想进行JPA样式搜索,搜索Person对象中的所有可用列以及相关/嵌入Record对象列表中的所有可用列。例如,如果searhString是“tom”而Person实体1的名称是“tom”,那么将返回(包含所有嵌入对象),如果Person实体10,例如,则为factor1的值为“tom”对象也将被退回。

由于

1 个答案:

答案 0 :(得分:1)

select distinct p from Person p
left join fetch p.records r
where p.name like :search 
  or r.factor1 like :search

在将其作为参数传递之前,您需要在搜索周围添加%字符。