Spring-data-jpa存储库查询关键字" In"不适用于openJPA版本2.3.0或更高版本

时间:2016-06-19 07:51:19

标签: jpa spring-data spring-data-jpa openjpa spring-orm

修改:

我已将标题修改为更多指定。

验证后,问题是存储库查询关键字" In"当我们使用openJPA lib版本2.3.0或更高版本时,它不起作用。

工作正常的原始lib依赖关系如下

openjpa: 2.2.2
Spring framework(orm, test, context, etc..): 4.1.1.RELEASE
spring-data-jpa: 1.3.0.RELEASE
postgres-jdbc: 9.4-1201-jdbc41
jdk: 1.7

如果openjpa已升级到2.3.0,2.4.0或2.4.1,则查询关键字" In"将始终坚持在第一次给出的参数。

即使我们将所有可能相关的lib升级到最新版本仍然无法正常工作。无论使用jdk 1.7还是1.8(使用相应的postgreSQL jdbc驱动程序)

openjpa: 2.4.1
Spring framework(orm, test, context, etc..): 4.3.0.RELEASE
spring-data-jpa: 1.10.2.RELEASE
postgres-jdbc: 9.4.1208
jdk: 1.8

更新

看起来存储库查询关键字In在此处存在问题。

我们尝试将findByDeviceId测试为以下代码,只有findBy而不是findByIn

        List<Subtask> subtasks = this.subtaskDao.findByDeviceId("1000000002");
        print(subtasks);
        List<Subtask> subtasks1 = this.subtaskDao.findByDeviceId("1000000003");
        print(subtasks1);
        List<Subtask> subtasks2 = this.subtaskDao.findByDeviceId("1000000004");
        print(subtasks2);enter code here

工作正常。结果是正确的。

我们还尝试使用下面的存储库接口的JPQL,它使用@Query注释进行查询。

@Query("SELECT entity FROM Subtask as entity WHERE entity.deviceId IN :deviceIdList AND entity.state IN :states")
public List<Subtask> findByDeviceIdInAndStateInOrderByIdAsc(@Param("deviceIdList") Collection<String> deviceIdList, @Param("states")  Collection<Integer> states);

这样,即使参数是List,结果也是正确的。

因此,只有在查询方法中使用findBy时,结果才会错误。

DaoBase界面如下

@NoRepositoryBean
public interface DaoBase<T extends EntityBase, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>
{}

openJPA版本2.3.0的存储库查询关键字In发生了什么?

我们有一个DAO接口子任务,如下所示

public interface SubtaskDao extends DaoBase<Subtask, Long>
{
    public List<Subtask> findByDeviceIdInAndStateInOrderByIdAsc(Collection<String> deviceIdList, Collection<Integer> states);
}

junit测试如下

List<Subtask> subtasks = this.subtaskDao.findByDeviceIdInAndStateInOrderByIdAsc(Arrays.asList(new String[]{"1000000002"}), Arrays.asList(new Integer[]{5,10}));
System.out.println("1" + subtasks);
print(subtasks);
List<Subtask> subtasks1 = this.subtaskDao.findByDeviceIdInAndStateInOrderByIdAsc(Arrays.asList(new String[]{"1000000003"}), Arrays.asList(new Integer[]{5,10}));
System.out.println("2" + subtasks1);
print(subtasks1);
List<Subtask> subtasks2 = this.subtaskDao.findByDeviceIdInAndStateInOrderByIdAsc(Arrays.asList(new String[]{"1000000004"}), Arrays.asList(new Integer[]{5,10}));
System.out.println("3" + subtasks2);
print(subtasks2);

private void print(List<Subtask> subtasks)
{
    for (Subtask subtask : subtasks)
    {
        System.out.println(subtask.getId() + ", " + subtask.getDeviceId());
    }
}

当我们使用openJPA版本2.2.2和spring-data-jpa版本1.3.0时,结果将是正确的.RELEASE

1[devicemanage.repository.appdeploy.entity.Subtask@3b01897f, devicemanage.repository.appdeploy.entity.Subtask@6b3b2c34]
444, 1000000002
2[devicemanage.repository.appdeploy.entity.Subtask@4377ed24, devicemanage.repository.appdeploy.entity.Subtask@7a30e30b]
447, 1000000003
449, 1000000003
3[devicemanage.repository.appdeploy.entity.Subtask@b339a08, devicemanage.repository.appdeploy.entity.Subtask@1d556461]
410, 1000000004

但是当我们将openJPA lib升级到2.3.0或更高版本(2.4.0或2.4.1)时。结果将变得不正确如下

1[devicemanage.repository.appdeploy.entity.Subtask@77a9ac36, devicemanage.repository.appdeploy.entity.Subtask@3c743d40]
444, 1000000002
2[devicemanage.repository.appdeploy.entity.Subtask@3a5ce4b8, devicemanage.repository.appdeploy.entity.Subtask@38848217]
444, 1000000002
3[devicemanage.repository.appdeploy.entity.Subtask@511d5e6e, devicemanage.repository.appdeploy.entity.Subtask@7a78d380]
444, 1000000002

看起来每个findByDeviceIdInAndStateInOrderByIdAsc都给出了一个参数deviceIdList Array.asList(new String [] {"1000000002"}),因此每个查找结果都是设备1000000002的子任务。

DB是postgreSQL 9.4 windows版本,JDBC驱动程序如下

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1201-jdbc41</version>
        </dependency>

我们有什么遗漏的吗?

0 个答案:

没有答案