我有一个mysql内部联接查询,它联接数据库中的3个表,并生成所需的结果集。现在我想使用session.createQuery()编写相应的hibernate查询。我已经在我的项目中为这3个表创建了模型类。没有与3个表关联的映射。mysql查询如下所示。
select b.ID, b.Date, d.Name, IF(c.Amount < 0, c.Amount * -1, c.Amount) Amount, IF(c.Amount < 0, "Payment", "Receipt") Type from (select TransactionID from TransactionDetail where AccountID = 56) a inner join TransactionHeader b on a.TransactionID = b.ID inner join TransactionDetail c on a.TransactionID = c.TransactionID inner join Account d on c.AccountID = d.ID where c.AccountID <> 56;
现在请告诉我如何使用hibernate session.createQuery()编写这个查询?请帮助我。下面是3个表的模型类
帐户. java:
@Entity
@Table(name = "Account")
public class Accounts {
@Id
@GeneratedValue
@Column(name="ID")
private Integer id;
@Column(name="Name")
private String name;
public Accounts() {
super();
// TODO Auto-generated constructor stub
}
public Accounts(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
TransactionDetails.java:
@Entity
@Table(name = "TransactionDetail")
public class TransactionDetails {
@Id
@GeneratedValue
@Column(name="ID")
private Integer id;
@Column(name="TransactionID")
private Integer transactionID;
@Column(name="AccountID")
private Integer accountID;
@Column(name="Amount")
private Float amount;
public TransactionDetails() {
super();
// TODO Auto-generated constructor stub
}
public TransactionDetails(Integer id, Integer transactionID,
Integer accountID, Float amount) {
super();
this.id = id;
this.transactionID = transactionID;
this.accountID = accountID;
this.amount = amount;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getTransactionID() {
return transactionID;
}
public void setTransactionID(Integer transactionID) {
this.transactionID = transactionID;
}
public Integer getAccountID() {
return accountID;
}
public void setAccountID(Integer accountID) {
this.accountID = accountID;
}
public Float getAmount() {
return amount;
}
public void setAmount(Float amount) {
this.amount = amount;
}
}
TransactionHeaders.java:
@Entity
@Table(name = "TransactionHeader")
public class TransactionHeaders {
@Id
@GeneratedValue
@Column(name="ID")
private Integer id;
@Column(name="Date")
private Timestamp date;
public TransactionHeaders() {
super();
// TODO Auto-generated constructor stub
}
public TransactionHeaders(Integer id,Timestamp date) {
super();
this.id = id;
this.date = date;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Timestamp getDate() {
return date;
}
public void setDate(Timestamp date) {
this.date = date;
}
}
在当前实体映射中,您必须使用交叉连接(或自然连接),并将连接条件添加为where条件,例如:
SELECT <whatever> FROM TransactionHeaders h, TransactionDetails d, Account a
WHERE
h.TransactionID = d.TransactionID
AND c.AccountID = d.ID
AND h.TransactionID IN (SELECT TransactionID from TransactionDetail where AccountID = 56)
AND c.AccountID != 56
要使用HQL/JPQL连接,您必须更改映射以使用实体关系,即多对多等。
顺便说一句,我将致力于您的命名方案以遵守约定,即字段将以小写字母开头(例如transactionID
),实体类名应描述单个实体(例如TransactionHeader
而不是TransactionHeaders
)。
要使用一些选项进行查询,您需要:
Query que;
StringBuilder where = new StringBuilder();
String query = "select h from " + entityClass.getName() + " h ";
要加入,请执行以下操作:
query = query +" [LEFT] JOIN FETCH h.table t ";
添加参数
where.append(" t.field LIKE :attribute");
que.setParameter("attribute", "your_value"));
使用给定的参数创建查询
que = em.createQuery(String.format("%s WHERE %s", query, where));
要获得结果
que.getResultList();
如果实体之间没有关系,则可以将其全部放在 where
子句中,而不是内部连接。
例如,a.事务 ID 上的内部连接事务标题 b = b.ID
将从
更新
对于
select
子句中的条件字段,使用CASE… WHEN
语法
Query query=getCurrentSession().createQuery("SELECT A.transactionID, A.id, A.accountID, CASE WHEN A.amount < 0 THEN (A.amount*-1) ELSE A.amount END as Amount, CASE WHEN A.amount < 0 THEN 'Payment' ELSE 'Receipt' END as Type, B.date, C.name from TransactionHeaders B, TransactionDetails A, Accounts C where B.id = A.transactionID and A.accountID = C.id and A.transactionID in (SELECT D.transactionID from TransactionDetails D where D.accountID = :Id)");
query.setParameter("Id", id);
问题内容: 当我们必须使用 在Hibernate中,它们之间有什么区别? 问题答案: createQuery: http://docs.jboss.org/hibernate/core/3.6/reference/zh- CN/html/objectstate.html#objectstate- querying http://docs.jboss.org/hibernate/core/3.6/r
问题内容: Hibernate必须在具有唯一字段的表中进行插入。我想忽略重复的条目,以便我的程序继续运行。在MySQL中,我只会说,但是我不知道如何在Hibernate中做到这一点。有什么建议么?谢谢! 问题答案: 如果您使用的是简单的SQL查询,请使用以下代码。
我在Oracle SQL Developer中创建了三个表,即 。表是连接表,因为和之间的关系是。 在hibernate中,我为和表创建了两个hibernate类和, 和表在hibernate类中定义如下: 我用一些记录填充了表和,连接表自动填充了一些记录。现在我目前面临的问题是,我想使用hiberante在连接表上使用一个简单的选择语句,如下所示: 我怎么能做到这一点,尽管联接表'Employe
嗨,我正在尝试使用左外部连接执行hql查询,它是thwhing异常作为org.hibernate.hql.ast.querysyntaxException:意外标记:在第1行附近,可以告诉我这个查询中有什么问题吗 从CreditCardDetails cred左外连接CustomerHistory custHist on cred.creditCardDetailSid=custHist.Cred
我必须得到特定的数据,如"角色"表已提交状态,我需要状态=1,所有数据从角色表
问题内容: 我是Hibernate和Criteria Query的新手。所以我在HQL中实现了查询: 如何使用hibernate条件对象实现它? 问题答案: 您的示例只是本机SQL,而不是HQL。无论如何,您可以使用Criteria API中的以下方法来构造所需的Criteria对象: 使用setProjection(Projection projection)定义select子句 使用creat