JPQL join实体字段值为IS NULL

时间:2014-10-27 08:11:33

标签: java sql jpa hql jpql

我的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)
    ..
}

0 个答案:

没有答案