2015-01-15 3 views
-1

У меня есть внутренний запрос соединения mysql, который объединяет 3 таблицы в базе данных и который приводит к требуемому набору результатов. Теперь я хочу написать соответствующий запрос на спящий режим, используя session.createQuery(). Я создал класс модели для этих 3 таблиц в моем проекте. Нет сопоставления, связанного с 3 таблицами. Запрос mysql приведен ниже.Как написать внутреннее соединение в hibernate с помощью createQuery()

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; 

Теперь, пожалуйста, скажите мне, как написать этот запрос, используя спящий режим session.createQuery()? Пожалуйста, помогите me.Below является модель класса для 3-х таблиц

Accounts.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; 
} 


} 
+0

Возможно, вы захотите сначала предоставить некоторую информацию о вашем сущности. – Thomas

+0

Я обновил вопрос с помощью класса модели – KJEjava48

ответ

1

Вы можете поместить все это в пункт where вместо внутреннего соединения, если между объектами нет никакой связи.

Например, a inner join TransactionHeader b on a.TransactionID = b.ID станет from <some table> a, <some other table> b where a.TransactionID = b.ID.

UPDATE

Для условных полей в 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); 
+0

вы можете написать полный запрос, пожалуйста ... – KJEjava48

+2

Просто примените это к остальной части запроса, вы можете сделать это на время, когда потребовалось вам написать этот комментарий. Если у вас есть другие проблемы с этим вопросом, пожалуйста, обновите вопрос своими усилиями, и мы поможем вам в дальнейшем. –

+0

Как я могу получить тип и сумму, используя условие в этом запросе? Пожалуйста, помогите мне – KJEjava48

0

Чтобы сделать query с некоторыми вариантами, вам понадобятся:

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")); 

Для создания запроса с заданными Params

que = em.createQuery(String.format("%s WHERE %s", query, where)); 

Чтобы получить результаты

que.getResultList(); 
+0

, пожалуйста, напишите мой mysql-запрос, используя createQuery(). – KJEjava48

+0

Я дал вам инструменты ... теперь ваша очередь работать ...;) –

+0

Я не понял ваш пример .. – KJEjava48

0

С текущего отображения объекта вы должны использовать кросс присоединяется (или естественные соединения) и добавьте присоединиться условия, в которых условия, например:

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 

Чтобы сделать u вы должны изменить свое сопоставление, чтобы использовать отношения сущностей, то есть много-ко-многим и т. д.

Кстати, я бы поработал над вашей схемой именования, чтобы придерживаться конвенции, т.е. поля начинайте с строчных букв (например, transactionID), а имена классов сущностей должны описывать сингулярную сущность (например, TransactionHeader вместо TransactionHeaders).

Смежные вопросы