Java 如何重写此HQL查询以正确工作
我有3个实体-TUser、TRequest和TComment。TUser对TRequest,1对多的关系。t请求到t引用,关系1到多。我想计算每个TUser的评估。最初,我在TRequest中有一个评估栏,我的查询工作正常:Java 如何重写此HQL查询以正确工作,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,我有3个实体-TUser、TRequest和TComment。TUser对TRequest,1对多的关系。t请求到t引用,关系1到多。我想计算每个TUser的评估。最初,我在TRequest中有一个评估栏,我的查询工作正常: Query query = em.createQuery("select hiredAgency, sum(r.assessment)/(count(r.assessment)), " + "count(r.assessmen
Query query = em.createQuery("select hiredAgency, sum(r.assessment)/(count(r.assessment)), "
+ "count(r.assessment) "
+ "from TAgency hiredAgency join hiredAgency.executedRequests r "
+ "group by hiredAgency.tUserId, hiredAgency.address, hiredAgency.city, hiredAgency.information,"
+ "hiredAgency.website")
现在,评估报告已提交。我尝试了以下查询:
Query query = em.createQuery("select r.hiredAgency, " +
"sum(u.assessment)/(count(u.assessment)), " +
"count(u.assessment) " +
"from TRequest r join r.requestComments u " +
"group by r.hiredAgency.tUserId, r.hiredAgency.address, r.hiredAgency.city, r.hiredAgency.information," +
"r.hiredAgency.website");
List<Object[]> list = query.getResultList();
这里是我的实体。
TRequest:
public class TRequest implements java.io.Serializable {
private Set<TComment> requestComments = new HashSet<TComment>(0);
private TAgency hiredAgency;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "HIRED_AGENCY_ID")
public TAgency getHiredAgency() {
return this.hiredAgency;
}
public void setHiredAgency(TAgency hiredAgency) {
this.hiredAgency = hiredAgency;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "tRequest")
public Set<TComment> getRequestComments() {
return requestComments;
}
public void setRequestComments(Set<TComment> requestComments) {
this.requestComments = requestComments;
}
}
显著性:
public class TAgency implements java.io.Serializable {
private Long tUserId;
private TUser tUser;private String website;
private String city;
private String address;
private String information;
private Set<TRequest> executedRequests = new HashSet<TRequest>(0);
private Set<TAgencyEventType> tAgencyEventTypes = new HashSet<TAgencyEventType>(
0);
//+ get and set methods
@OneToMany(fetch = FetchType.LAZY, mappedBy = "hiredAgency")
public Set<TRequest> getExecutedRequests() {
return executedRequests;
}
public void setExecutedRequests(Set<TRequest> executedRequests) {
this.executedRequests = executedRequests;
}
}
我希望查询返回标记对象(hiredAgency)、hiredAgency从所有向其发出请求的人那里收到的平均评估以及评估该对象的人数(give assessment)
我无法理解我没有正确执行的操作。您的SGBD是什么?此外,您的加入有错误。我使用Oracle数据库服务器。您的问题与您显示的查询不符。您说有三个表
TUser、TRequest和TComment
,在您的查询中只有一个TAgency
,而且您还说它工作了,但不能运行(第一个),因为join
子句是错误的,除非此hiredAgency.executedRequests
是TAgency
中的一个内部表,否则您不能将任何内容与任何TAgency hiredAgency.join hiredAgency.executedRequests r
连接,但即使它是,它也缺少hiredAgency.someid=r.someid
之类的ON
子句。如果你展示你的桌子结构并询问你想要什么,那会更好。因为这些查询无法工作,也无法向您获取正确的值。是的,第一个查询工作正常(当它工作时,评估列在TRequest表中)。我添加了表的DDL,您可以看到它。
public class TComment implements java.io.Serializable {
private int assessment; // +get and set methods
private TRequest tRequest;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "T_REQUEST_ID", nullable = false)
public TRequest gettRequest() {
return tRequest;
}
public void settRequest(TRequest tRequest) {
this.tRequest = tRequest;
}
}
public class TAgency implements java.io.Serializable {
private Long tUserId;
private TUser tUser;private String website;
private String city;
private String address;
private String information;
private Set<TRequest> executedRequests = new HashSet<TRequest>(0);
private Set<TAgencyEventType> tAgencyEventTypes = new HashSet<TAgencyEventType>(
0);
//+ get and set methods
@OneToMany(fetch = FetchType.LAZY, mappedBy = "hiredAgency")
public Set<TRequest> getExecutedRequests() {
return executedRequests;
}
public void setExecutedRequests(Set<TRequest> executedRequests) {
this.executedRequests = executedRequests;
}
}
create table T_REQUEST
(
id NUMBER(19) not null,
hired_agency_id NUMBER(19)
)
create table T_COMMENT
(
id NUMBER(19) not null,
t_request_id NUMBER(19) not null,
assessment NUMBER(10)
)
create table T_AGENCY
(
t_user_id NUMBER(19) not null,
address VARCHAR2(150 CHAR),
city VARCHAR2(60 CHAR) not null,
information VARCHAR2(512 CHAR) not null,
website VARCHAR2(150 CHAR)
)