Spring瞬态注释可用于保存,但不适用于选择

时间:2019-09-06 14:10:11

标签: java hibernate jpa

我正在显示带有服务名称和最后价格记录的表格。当我在Service类中使用@Transient时,就会发生问题。

在这种情况下:

enter image description here

我这样做:

public List<Service> findAllWithPrice() {
    NativeQuery<Service> query = 
            this.getCurrentSession()
                .createSQLQuery(
                    "select s.*, FORMAT((select ps.price from priceServices ps where ps.idService = s.id order by ps.dateRegister DESC limit 1),2) as currentPrice from service s");
    query.addEntity( Service.class );

    return query.getResultList();
}

/*********************/

@Entity
@Table(name = "service")
public class Service  {
    /****/
    @Transient
    private String currentPrice;

    public String getCurrentPrice() {
        if ( currentPrice == null ) {
            return "$ 0.0";
        }
        return currentPrice;
    }
}

如果我离开@Transient,则同时保存并选择工作,但所有价格均为零。 currentPrice将为空。

如果我删除@Transient,则选择正确。它以每个服务的最后注册价格加载服务。

但是当我存到银行时,它返回一个错误,指出它没有找到currentPrice列(因为它确实不存在)。

我在论坛和互联网上进行了搜索,但是没有找到解决方法。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

借助@ M.Prokhorov提示,我能够如下解决我的问题:

在ServiceDaoImpl类中,我停止使用 findAllWithPrice 方法仅使用 findAll

public List<Service> findAll() {
    return this.getCurrentSession().createQuery("from Service", Service.class).getResultList();
}

在服务类中,我创建了一个公式来获取上次记录的价格

@Entity
@Table(name = "service")
public class Service  {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    /****/
    @Formula("(FORMAT((select ps.price from priceServices ps where ps.idService = id order by ps.dataRegister DESC limit 1),2))")
    private String currentPrice;

    public String getCurrentPrice() {
        if ( currentPrice == null ) {
            return "$ 0.0";
        }
        return currentPrice;
    }
}