【发布时间】:2015-10-28 18:11:50
【问题描述】:
我有一个设置,猫可以由多个主人拥有,每个主人可以拥有几只猫。鉴于此,我想编写一个规范来帮助我找到具有给定所有者名称的所有猫。
这是一个简单的类设置。
@Entity
public class Cat extends AbstractEntity {
@Column
private String name;
}
* 为简洁起见,没有 getter/setter。 id 字段在超类中。
@Entity
public class Owner extends AbstractEntity {
@Column
private String name;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "OWNER_2_CATS",
joinColumns = @JoinColumn(name = "OWNER_ID"),
inverseJoinColumns = @JoinColumn(name = "CAT_ID"))
@OrderColumn(name = "order_column")
private List<Cat> cats = Lists.newArrayList();
}
* 为简洁起见,没有 getter/setter。 id 字段在超类中。
这是一个存储库,其中包含一个有效的查询和一个无效的规范。
public interface CatRepository extends AtomicsRepository<Cat, Long> {
// This query works.
@Query("SELECT c FROM Owner o INNER JOIN o.cats c WHERE o.name = ?")
List<Cat> findAllByOwner(String ownerName);
// But how do I accomplish this in a specification?
public static class Specs {
static Specification<Cat> hasOwnerName(final String ownerName) {
return (root, query, cb) -> {
// These next lines don't work! What do I put here?
Root<Owner> owner = query.from(Owner.class);
owner.join("cats");
return cb.equal(owner.get("name"), ownerName);
};
}
}
}
请帮我写规范。
我遇到的问题是这种关系似乎需要违背关系的表达方式:所有者有一个cats 列表,但猫没有owners 列表。
【问题讨论】:
-
你想达到什么目的?
-
catRepository.findAll(CatRepository.Specs.hasOwnerName("Bob")应该返回 Bob 拥有的所有猫。