2015-09-06 4 views
0

У меня есть устройство и device_group таблицы, отображение по таблице device_group_mapping нижеFetch соединит JPQL в OpenJPA для многих многих отображения

CREATE TABLE device_group_mapping 
(
    device_id character varying(64) NOT NULL, 
    device_group_id bigint NOT NULL, 
    CONSTRAINT "FK_device_group_mapping_device" FOREIGN KEY (device_id) 
     REFERENCES device (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT "FK_device_group_mapping_device_group" FOREIGN KEY (device_group_id) 
     REFERENCES device_group (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 

Устройства и deviceGroup-объект OpenJPA, как показано ниже

@Entity 
@Table(name = "device") 
public class Device implements Serializable 
{ 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "device_group_mapping", joinColumns = 
    {@JoinColumn(name = "device_id", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = 
    {@JoinColumn(name = "device_group_id", referencedColumnName = "id", nullable = false)}) 
    private List<DeviceGroup> deviceGroupCollection; 
} 

@Entity 
@Table(name = "device_group") 
public class DeviceGroup implements Serializable 
{ 
    @ManyToMany(mappedBy = "deviceGroupCollection", fetch = FetchType.EAGER) 
    @OrderBy() 
    private List<Device> deviceCollection; 
} 

Благодаря тип выборки ленив, я должен получить deviceGroupCollection ниже код

@Override 
@Transactional 
public List<Device> findAllDevicesWithGroupMapping() throws Exception 
{ 
    List<Device> list = new ArrayList<Device>(); 

    list = this.deviceDao.findAll(); 

    for (Device device : list) 
    { 
     device.setDeviceGroupCollection(device.getDeviceGroupCollection()); 
    } 
    return list; 
} 

Однако это будет очень медленно, когда список устройств содержит количество устройств.

Я думаю, что, может быть, я мог бы просто найти объект устройства JPQL с помощью fetch присоединиться к device_group, но не знаю, как это сделать. Согласно спецификации openjpa, он не поддерживает предложение, а также вложенное объединение.

OpenJPA я в настоящее время используется как ниже

<dependency> 
     <groupId>org.apache.openjpa</groupId> 
     <artifactId>openjpa-all</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

Любая помощь приветствуется.

ответ

1

Вы используете fetch, присоединяетесь к ManyToMany как к любой другой ассоциации. Вам не нужны никакие on Clase, так как отображение ассоциации уже определяет, как две сущности связаны друг с другом:

select d from Device d 
left join fetch d.deviceGroupCollection 
where ... 
+0

Спасибо JB. Этот ответ решил мою проблему. – Bruce

 Смежные вопросы

  • Нет связанных вопросов^_^