Hibernate注释到瞬态集合字段

时间:2013-08-26 22:43:28

标签: java hibernate spring-data spring-data-jpa

我想要一个集合字段来使用查询,但我找不到办法来做到这一点。有一个@Formula注释,但这不适用于集合。 你可能会问我为什么不使用@ManyToMany或类似的注释。问题是,我有一个表(比如名为Relationships),其列与此类似:

ID | ChildType | ChildID | ParentType | ParentID |

现在,ChildType和ParentType可以是我的应用程序中的许多类之一,因此我不能(我不想)使用@ManyToMany映射,因为它将为每个类创建另一个表。我想要的是,在A类中有一个称为关系的集合字段,它将从关系表where ChildID = A.id and ChildType = 'A'中选择所有行(关系)。这可能吗?

更新:看起来我还没有说清楚。好吧,比方说,我有一个类关系,其中ParentTypeChildType只是父类和子类的类名作为字符串:

@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表,找到每个类的关系,ABC每当我得到一个相应的实例bean时类。 像这样:

@Query("(select relationship from Relationship relationship where relationship.childId = id and relationship.childType = 'A')")
private Set<Relationship> relationships = new ArrayList<Relationship>();

2 个答案:

答案 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实体的每个服务类中,添加关系资源,并通过添加设置关系字段的代码来编辑findfindAll或其他任何方法。

@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..
}