简体   繁体   中英

Fetch join by JPQL in openjpa for many to many mapping

I have a device and device_group table, mapping by a device_group_mapping table as below

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
);

The device and deviceGroup entity of openjpa as below

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

Due to the fetch type is lazy, I have to get the deviceGroupCollection as below code

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

However, this will be very slow when list of devices contains amount of devices.

I think maybe I could just find device entity by JPQL with fetch join the device_group, but don't know how to do it. According to openjpa spec., it doesn't support on clause and also nested fetch join.

The openjpa I currently used as below

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

Any help is appreciated.

You use a fetch join an a ManyToMany like on any other association. You don't need any on clase, since the association mapping already defines how the two entities are linked to each other:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM