我想要一个集合字段来使用查询,但我找不到办法来做到这一点。有一个@Formula
注释,但这不适用于集合。
你可能会问我为什么不使用@ManyToMany
或类似的注释。问题是,我有一个表(比如名为Relationships),其列与此类似:
ID | ChildType | ChildID | ParentType | ParentID |
现在,ChildType和ParentType可以是我的应用程序中的许多类之一,因此我不能(我不想)使用@ManyToMany
映射,因为它将为每个类创建另一个表。我想要的是,在A类中有一个称为关系的集合字段,它将从关系表where ChildID = A.id and ChildType = 'A'
中选择所有行(关系)。这可能吗?
更新:看起来我还没有说清楚。好吧,比方说,我有一个类关系,其中ParentType
和ChildType
只是父类和子类的类名作为字符串:
@Entity
public class Relationship {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private ParentType parentType;
private Long parentId;
@Enumerated(EnumType.STRING)
private ParentType childType;
private Long childId;
}
然后我有各种具有字段relationships
的类,比如说:
@Entity
public class A {
@Id
@GeneratedValue
private Long id;
private Set<Relationship> relationships = new HashSet<Relationship>();
}
@Entity
public class B {
@Id
@GeneratedValue
private Long id;
private Set<Relationship> relationships = new HashSet<Relationship>();
}
@Entity
public class C {
@Id
@GeneratedValue
private Long id;
private Set<Relationship> relationships = new HashSet<Relationship>();
}
现在我希望Hibernate查询Relationships
表,找到每个类的关系,A
,B
和C
每当我得到一个相应的实例bean时类。
像这样:
@Query("(select relationship from Relationship relationship where relationship.childId = id and relationship.childType = 'A')")
private Set<Relationship> relationships = new ArrayList<Relationship>();
答案 0 :(得分:0)
考虑到relation_ship是你的关系表,上面描述的表是parent_child
SQLQuery query = session.createSQLQuery(
"SELECT r
FROM relation_ship r
INNER JOIN
parent_child p
ON r.id = p.ChildID and
p.ChildType := ChildType").setParameter("ChildType","A");
List<Relationship> = query.list();
答案 1 :(得分:0)
我现在做了一个解决方法,但我仍然想知道是否有办法在我的Entity类中添加注释。
解决方法如下:
在Relationship的存储库界面中添加一个方法,该方法扩展JpaRepository
。
public List<Relationship> findByChildIdAndChildType(Long childId,
String childType);
然后,在A,B,C实体的每个服务类中,添加关系资源,并通过添加设置关系字段的代码来编辑find
和findAll
或其他任何方法。
@Service
@Transactional
public class AService implements IAService {
@Resource
private IARepository aRepository;
@Resource
IRelationshipRepository relationshipRepository;
@Override
public A findOne(Long id) {
A a = aRepository.findOne(id);
List<Relationship> relationships = new ArrayList<Relationship>();
relationships =
relationshipRepository.findByChildIdAndChildType(id, 'A');
a.setRelationships(relationships);
return a;
}
// other fields and methods omitted..
}