我有以下 HQL 查询:
SELECT bu FROM Backup bu WHERE bu.status = :status ORDER BY bu.container.techId ASC
每当查询结果 > 0 时,查询就会卡住,这意味着 query.getResultList() 永远不会返回。但是,如果我删除 ORDER BY 子句,只留下 SELECT bu FROM Backup bu WHERE bu.status = :status 它运行良好
我的课程是:
public class Backup implements Serializable {
@Id
@Column(name="ID")
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
private String id;
@Column(name="PVAID", nullable=true)
private String PVAID;
@Column(name="Error", nullable=true)
private String error;
@Column(name="\"Size\"", nullable=false)
private Long backupSize;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="startdate", nullable=false)
private Date startDate;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="enddate", nullable=true)
private Date endDate;
@Column(name="status", nullable=false)
private Short status;
@ManyToOne
@JoinColumn(name="fullbackupid", referencedColumnName="ID", nullable=true)
private Backup fullBackup;
@ManyToOne
@JoinColumn(name = "ContainerID", referencedColumnName="ID", nullable=false)
private Container container;
}
和
public class Container implements Serializable {
@Id
@Column(name="ID")
private String id;
@ManyToOne
@JoinColumn(name="HardwareNodeID", referencedColumnName="ID", nullable=false)
private HardwareNode hardwareNode;
@ManyToOne
@JoinColumn(name="BackupServerID", referencedColumnName="ID", nullable=false)
private BackupServer backupServer;
@Column(name="TechID", nullable=false)
private Integer techId;
@Column(name="Exclude", nullable=false)
private Boolean exclude;
@Column(name="retry_backup", nullable=true)
private Short retryBackUp;
@Column(name="retry_delay", nullable=true)
private Short retryDelay;
}
执行查询的代码
public List<T> getAllByFilter(final boolean isNamedQuery, final String queryString, final HashMap<String, Object> fields, final int startRecord, final int maxResults) {
logger.log(Level.INFO, "Loading all paginated");
final EntityManager em = emf.createEntityManager();
Query query = null;
if(isNamedQuery) {
query = em.createNamedQuery(queryString);
} else {
query = em.createQuery(queryString);
}
final Set<?> set = fields.entrySet();
final Iterator<?> i = set.iterator();
while(i.hasNext()){
final Map.Entry me = (Map.Entry)i.next();
final String field = (String)me.getKey();
final Object value = me.getValue();
System.out.println(me.getKey() + " : " + me.getValue() );
query.setParameter(field, value);
}
query.setFirstResult(startRecord);
if (maxResults!=0) query.setMaxResults(maxResults);
return query.getResultList();
}
SQL查询似乎也很好:
13:45:03,583 INFO [STDOUT] Hibernate: select top 41 backup0_.ID as ID153_, backup0_.IsFullBackup as IsFullBa2_153_, backup0_.PVAID as PVAID153_, backup0_.Error as Error153_, backup0_.[Size] as Size5_153_, backup0_.startdate as startdate153_, backup0_.enddate as enddate153_, backup0_.status as status153_, backup0_.ManualBackup as ManualBa9_153_, backup0_.fullbackupid as fullbac10_153_, backup0_.ContainerID as Contain11_153_ from Backups backup0_, Containers container1_ where backup0_.ContainerID=container1_.ID and backup0_.status=? order by container1_.TechID DESC
底层数据库是 SQL Server。
问题可能出在哪里?有人遇到过类似的事情吗?谢谢