我有一个设置,猫可以由许多主人拥有,每个主人可以拥有几只猫。有鉴于此,我想写一个规范来帮助我找到所有拥有给定主人名字的猫。
下面是一个简单的类设置。
@Entity
public class Cat extends AbstractEntity {
@Column
private String name;
}
*简洁性方面没有获得者/接受者。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();
}
*简洁性方面没有获得者/接受者。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);
};
}
}
}
请帮我写一下说明书。
我遇到的问题是,这种关系似乎需要与这种关系的表达方式背道而驰:主人有一个猫列表,但猫没有主人列表。
简单的回答是:
Page<Cat> findByOwner_Name(String ownerName, Pageable p);
但困难在于如何查询那些不属于任何人的猫,这等于
select * from cat where cat.id NOT IN (select cat.id from owner_has_cat);
有人知道吗?
您可以使用子查询生成一个IN谓词来获取cat的id值。
public static class Specs {
static Specification<Cat> hasOwnerName(final String ownerName) {
return (root, query, cb) -> {
//EntityType<Cat> Cat_ = root.getModel();
final Subquery<Long> queryOwner = query.subquery(Long.class);// Check type of the Cat's ID attribute
final Root<Owner> aliasOwner = queryOwner.from(Owner.class);
//EntityType<Owner> Owner_ = aliasOwner.getModel();
//final Join<Owner, Cat> aliasCatsOwner = aliasOwner.join(Owner_.cats);
final Join<Owner, Cat> aliasCatsOwner = aliasOwner.join("cats");
//queryOwner.select(aliasCatsOwner.<Long> get(Cat_.id)));
queryOwner.select(aliasCatsOwner.<Long> get("id")));// Check type and name of the Cat's ID attribute
queryOwner.where(cb.equal(Owner.<String> get("name"), ownerName));
//return cb.in(root.get(Cat_.id).value(queryOwner);
return cb.in(root.get("id").value(queryOwner);//check the name of ID attribute!
};
}
}
该规范的难点在于,您查询的是与所有者没有直接关系的猫。
总体思路是:
我首选的方法是使用子查询来介绍Owner:
// Subquery using Cat membership in the Owner.cats relation
public static class Specs {
static Specification<Cat> hasOwnerName(final String ownerName) {
return (root, query, cb) -> {
query.distinct(true);
Root<Cat> cat = root;
Subquery<Owner> ownerSubQuery = query.subquery(Owner.class);
Root<Owner> owner = ownerSubQuery.from(Owner.class);
Expression<Collection<Cat>> ownerCats = owner.get("cats");
ownerSubQuery.select(owner);
ownerSubQuery.where(cb.equal(owner.get("name"), ownerName), cb.isMember(cat, ownerCats));
return cb.exists(ownerSubQuery);
};
}
}
Hibernate4.3。x生成SQL查询,如下所示:
select cat0_.id as id1_1_
from cat cat0_
where
exists (
select owner1_.id from owner owner1_ where
owner1_.name=?
and (cat0_.id in (
select cats2_.cat_id from owner_2_cats cats2_ where owner1_.id=cats2_.owner_id
))
)
另一种方法是使用笛卡尔乘积来介绍所有者:
// Cat membership in the Owner.cats relation using cartesian product
public static class Specs {
static Specification<Cat> hasOwnerName(final String ownerName) {
return (root, query, cb) -> {
query.distinct(true);
Root<Cat> cat = root;
Root<Owner> owner = query.from(Owner.class);
Expression<Collection<Cat>> ownerCats = owner.get("cats");
return cb.and(cb.equal(owner.get("name"), ownerName), cb.isMember(cat, ownerCats));
};
}
}
Hibernate4.3。x生成SQL查询,如下所示:
select cat0_.id as id1_1_
from cat cat0_
cross join owner owner1_
where
owner1_.name=?
and (cat0_.id in (
select cats2_.cat_id from owner_2_cats cats2_ where owner1_.id=cats2_.owner_id
))
问题内容: 我有一个设置,其中猫可以由许多所有者拥有,每个所有者可以拥有几只猫。鉴于此,我想写一个说明来帮助我找到具有给定主人姓名的所有猫。 这是一个简单的类设置。 *为简洁起见,没有getters / setter。id字段在超类中。 *为简洁起见,没有getters / setter。id字段在超类中。 这是一个存储库,其中包含有效的查询和无效的规范。 请帮我写规范。 我遇到的麻烦是,这种关系
我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志:
假设我们有两个实体,Entity和Entity。有多个s。节点可以属于多个集群。因此,在
问题内容: 因此,我有以下实体: 因此,没有对的引用,这意味着我们具有单向一对多关系。我需要寻找一个by 和。也就是说,找到具有指定posId的供应商,然后在供应商的pos列表中找到一个pos。如何为此编写条件查询? 我尝试使用子查询。我的想法是创建一个子查询,该子查询将获取具有给定条件的a的所有内容。然后,主查询将那些中搜索的一个给定。 问题是我无法编写查询来获取s的s列表。显然,您不能编写以下
MongoDB多对多关联 如何在MongoDB中组织多对多关系 我在这种设置中看到的问题是MongoDB的16MB文档限制。假设我有s、s和s。有一个关联的和许多可能喜欢它的。中有许多和许多可以跟随它。一个可以有许多喜欢的并且可以跟随许多。如果我要用一个关系数据库来构建它,我会这样设置它: 理论上,如果在SQL查询中正确分页,则可以有有限数量的和跟随的;可以有无限数量的喜欢的;可以有无限数量的喜欢
本文向大家介绍Django 简单的多对多关系。,包括了Django 简单的多对多关系。的使用技巧和注意事项,需要的朋友参考一下 示例 在这里,我们定义了一种关系,其中一个俱乐部有许多Persons和成员,一个人可以是几个不同Clubs的成员。 尽管我们仅定义了两个模型,但django实际上为我们在数据库中创建了三个表。这些myapp_person,myapp_club和myapp_club_mem