Java 将Spring应用程序从Hibernate 4.3.1.Final迁移到5.4.27.Final
我正在尝试在一个老式的Spring应用程序中从hibernate 4.3.1.Final迁移到5.4.27.Final(大多数Spring组件都在版本4.3.13.Final上)。在更新版本修复了一些小问题(类导入)并使用maven构建应用程序后,我在尝试将此web应用程序部署到Tomcat 7.0.107(堆栈跟踪的一部分指向根异常)上时出现以下错误: AlarmLogRepository:Java 将Spring应用程序从Hibernate 4.3.1.Final迁移到5.4.27.Final,java,spring,hibernate,jpa,jpql,Java,Spring,Hibernate,Jpa,Jpql,我正在尝试在一个老式的Spring应用程序中从hibernate 4.3.1.Final迁移到5.4.27.Final(大多数Spring组件都在版本4.3.13.Final上)。在更新版本修复了一些小问题(类导入)并使用maven构建应用程序后,我在尝试将此web应用程序部署到Tomcat 7.0.107(堆栈跟踪的一部分指向根异常)上时出现以下错误: AlarmLogRepository: @Transactional(readOnly = true) public interfac
@Transactional(readOnly = true)
public interface AlarmLogRepository extends JpaRepository<AlarmLog, Long>, JpaSpecificationExecutor<AlarmLog> {
@Query("FROM AlarmLog " + //
"WHERE zipato=:zipato " + //
" AND alarmId=:alarmId " + //
" AND subtype='ZONE' " + //
" AND subtypeUuid=:zone " + //
" AND timestamp BETWEEN :start AND :end" + //
" AND needAck=true " + //
" AND size(AlarmLog.acks)=0")
List<AlarmLog> findAlarmLogsByZoneAndDatesAndNeedsAck(@Param("zipato") Zipato p_zipato,
@Param("alarmId") Integer p_alarmId,
@Param("zone") String p_zone,
@Param("start") Date p_start,
@Param("end") Date p_end);
@Transactional(readOnly=true)
公共接口AlarmLogRepository扩展了JpaRepository,JpaSpecificationExecutor{
@查询(“来自报警日志”+//
“其中zipato=:zipato”+//
“和alarmId=:alarmId”+//
“和子类型='ZONE'”+//
“和子UUID=:区域”+//
“和:开始和:结束之间的时间戳”+//
“AND needAck=true”+//
“和大小(AlarmLog.acks)=0”)
列出FindAlarmLogsByzone和Date以及NeedSack(@Param(“zipato”)zipato p_zipato,
@参数(“报警ID”)整数p_报警ID,
@参数(“区域”)字符串p_区域,
@参数(“开始”)p_开始日期,
@参数(“结束”)日期p_结束);
我曾尝试在谷歌上搜索此错误,但找不到未识别的复数属性的确切组合。我还尝试调试到某个级别,发现此集合
未被识别为集合类型,或者更准确地说,确认集合
不在列表中,因此无法识别为复数属性
我不知道如何解决这个问题
有什么想法吗?对于该查询,您应该为实体AlarmLog
设置标识符,并在where条件下以以下方式使用该标识符:
...
@Query("FROM AlarmLog al " +
"WHERE zipato=:zipato " +
" AND alarmId=:alarmId " +
" AND subtype='ZONE' " +
" AND subtypeUuid=:zone " +
" AND timestamp BETWEEN :start AND :end" +
" AND needAck=true " +
" AND size(al.acks)=0")
...
是的,就是这样!太简单了…我错过了。:(谢谢!
@Entity
@Table(name = "z_alarm_log_ack")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AlarmLogAck extends AbstractLongIdEntity {
private static final int MESSAGE_MAX_LENGTH = 200;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "zipato_id")
private Zipato zipato;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "log_id")
private AlarmLog log;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id")
private User user;
@Column(name = "show_date", nullable = false, columnDefinition = "DATETIME")
private Date showDate;
@Column(name = "ack_date", nullable = true, columnDefinition = "DATETIME")
private Date ackDate;
@Column(name = "message", length = MESSAGE_MAX_LENGTH, nullable = true)
private String message;
@Transactional(readOnly = true)
public interface AlarmLogRepository extends JpaRepository<AlarmLog, Long>, JpaSpecificationExecutor<AlarmLog> {
@Query("FROM AlarmLog " + //
"WHERE zipato=:zipato " + //
" AND alarmId=:alarmId " + //
" AND subtype='ZONE' " + //
" AND subtypeUuid=:zone " + //
" AND timestamp BETWEEN :start AND :end" + //
" AND needAck=true " + //
" AND size(AlarmLog.acks)=0")
List<AlarmLog> findAlarmLogsByZoneAndDatesAndNeedsAck(@Param("zipato") Zipato p_zipato,
@Param("alarmId") Integer p_alarmId,
@Param("zone") String p_zone,
@Param("start") Date p_start,
@Param("end") Date p_end);
...
@Query("FROM AlarmLog al " +
"WHERE zipato=:zipato " +
" AND alarmId=:alarmId " +
" AND subtype='ZONE' " +
" AND subtypeUuid=:zone " +
" AND timestamp BETWEEN :start AND :end" +
" AND needAck=true " +
" AND size(al.acks)=0")
...