我的JPA映射存在一些问题。 我写了那个查询:
String str = "
SELECT alrt.*
FROM
REACTION.ALERT alrt, REACTION.INVESTIGATION inv,
REACTION.CLASSIFICATION_TYPE clst, REACTION.FRAUD_TYPE frt,
REACTION.TRANS trns, REACTION.CARD crd
WHERE
alrt.ISS_INST IN(1111) AND
alrt.MODULE_TYPE = 1 AND
0 < (SELECT COUNT(*) FROM REACTION.INVESTIGATION WHERE REACTION.INVESTIGATION.ALERT_ID = alrt.ID) AND
inv.CLASSIFICATION_TYPE_ID IS NOT NULL AND
clst.CLASSIFICATION_TYPE = 2 AND
alrt.REMINDER_USER_LOGIN = 'a' OR alrt.REMINDER_USER_LOGIN IS NULL AND
alrt.ID = inv.ALERT_ID AND
alrt.TRANSACTION_ID = trns.ID(+) AND inv.CLASSIFICATION_TYPE_ID =
clst.ID AND inv.FRAUD_TYPE_ID = frt.ID(+) AND trns.HPAN = crd.HPAN(+)"
Query query = entityManager.createNativeQuery(str, Alert.class);
所以我收到了List实体作为结果。 一切看起来都很好,但警报实体中只有字段“事务”为空(alert.getTransaction()返回null),但在我的数据库中它的值为“61”。
这是交易价值在我的Alerts类中的呈现方式:
Table(name = "ALERT", schema = "REACTION")
@Entity(name = "Alert")
public class Alert extends AbstractBaseEntity {
private static final long serialVersionUID = 9007994864788693025L;
@Digits(fraction = 0, integer = 15)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ALERT_SEQ")
@SequenceGenerator(name = "ALERT_SEQ", sequenceName = "ALERT_SEQ", initialValue = 1, allocationSize = 100)
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
@JoinColumn(name = "TRANSACTION_ID")
private Transaction transaction;
....
这是来自交易实体的id字段:
@Entity(name = "Transaction")
@Table(name = "TRANS", schema = "REACTION")
public class Transaction extends AbstractTransaction {
private static final long serialVersionUID = 1110243741971153313L;
@Digits(fraction = 0, integer = 15)
@Id
@SequenceGenerator(name = "TRANS_SEQ", sequenceName = "TRANS_SEQ", allocationSize = 1000)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TRANS_SEQ")
private Long id;
...
我认为这是因为我在事务字段上有“fetch = FetchType.LAZY”。但是fetch = FetchType.EAGER并没有解决我的问题。也许有人可以帮助我?
UPDATE1: 尝试编写JPQL,但问题仍然相同:
SELECT alrt
FROM Investigation inv
JOIN inv.classificationTypeEntity clst
LEFT JOIN inv.fraudType frt
JOIN inv.alert alrt
LEFT JOIN alrt.transaction trns
LEFT JOIN trns.card crd
WHERE
alrt.issinst IN(:institutions) AND
alrt.module = :module AND 0 < (SELECT COUNT(inv1) FROM Investigation inv1 WHERE inv1.alert = alrt) AND
inv.classificationTypeEntity IS NOT NULL AND
clst.classificationType = :clstype AND
(alrt.reminderUserLogin = :userLogin OR alrt.reminderUserLogin IS NULL);
Query query = entityManager.createQuery(str)
.setParameter("institutions",institutions)
.setParameter("module",moduleType)
.setParameter("clstype",ClassificationType.POSTPONED)
.setParameter("userLogin", userLogin);
List<Alert> resultList = query.getResultList();
for (Alert alert : resultList) {
log.warn("ALERT TRANSACTION ID " + alert.Id()); ///returned ID
log.warn("ALERT TRANSACTION ID " + alert.getTransaction()); ///returned NULL, WHY?(must return TRANSACTION ENTITY WITH ID=61)
..
}