修改:
我已将标题修改为更多指定。
验证后,问题是存储库查询关键字" 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>
我们有什么遗漏的吗?