2

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

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表以查找每个类的关系,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>();
4

2 回答 2

0

考虑到 relationship_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();
于 2013-08-26T23:30:20.647 回答
0

我现在做了一个解决方法,但我仍然想知道是否有办法在我的 Entity 类中添加注释。

解决方法如下:在关系的存储库接口中添加一个方法,扩展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..
}
于 2013-08-27T17:32:14.187 回答