Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate ManyToMany-仅返回唯一元素_Java_Hibernate - Fatal编程技术网

Java Hibernate ManyToMany-仅返回唯一元素

Java Hibernate ManyToMany-仅返回唯一元素,java,hibernate,Java,Hibernate,我有三张桌子: Company id name 1 Fred Co. Person id name 1 Fred Employee id company_id person_id rank 1 1 1 1 2 1 1 2 现在,排名由另一个应用程序使用,但对于我使用的内容,我并不关心它。我想做的是通过域模型创建一个hibernate映射,该映射只返回唯一的雇员 我现在有 class Person {

我有三张桌子:

Company
id  name
1   Fred Co.

Person
id   name
1    Fred

Employee
id company_id person_id rank
1  1          1         1
2  1          1         2
现在,排名由另一个应用程序使用,但对于我使用的内容,我并不关心它。我想做的是通过域模型创建一个hibernate映射,该映射只返回唯一的雇员

我现在有

class Person {
    @Column(name = "id")
    Long id;

    @Column(name = "name")
    String id;
}

class Company {
    @Column(name = "id")
    Long id;

    @Column(name = "name")
    String id;

    @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "EMPLOYEE", 
                joinColumns = { @JoinColumn(name = "COMPANY_ID") },
                inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") })
    @LazyCollection(LazyCollectionOption.EXTRA)
    List<Person> employees = new ArrayList<Person>();
}

但是感觉有点不舒服,我想不用Dao就可以了。

如果第一条记录的秩始终设置为“1”,那么您可以在映射中添加一个简单的@Where/@WhereJoinTable子句,将集合限制为秩为1的记录

另一种方法是将集合更改为集合,并在不涉及“rank”字段的Person上实现equals方法

更新: 好的,正如你之前所说的,这是行不通的。我已经做了一些测试,而且似乎当@LazyCollection在一个关联上定义时,@对这个关联的限制被忽略了。对额外的惰性集合调用size实际上会导致Hibernate对数据库发出计数查询。附加条款未附加

为什么应该忽略@Where?我不知道,但这已经在其他地方被质疑,似乎是一个悬而未决的问题:

我认为您仍然可以通过创建一个额外的Employee实体来做您想做的事情,该实体映射到使用前面的SQL内部查询定义的视图,然后在db级别进行过滤。将实体映射到视图与映射到表是一样的


然后,用公司和员工之间的两个一对多关联替换您的多对多关联

谢谢你,艾伦。遗憾的是,排名并不总是一。这个固定的想法会奏效,但我必须变得不特别懒惰。我不打算继续这样做,因为这意味着加载1000个Person对象就可以得到一个计数。这将允许动态限制,方法是在加载时启用和筛选并设置所需参数,例如从XYZ(其中rank=从company_id=的员工中选择minrank)?person_id=?好主意,但这意味着我需要做hibernate.shakeMagicStickfredCo;fredCo.employees.size;哪一点对我来说有点不对劲,不妨做公司Dao.getEmployeesForfredCo?我认为视图是唯一的方法。谢谢
companyDao.getEmployeesFor(Company...)
companyDao.getEmployeeCountFor(Company...)