Попытка использовать функцию SQL в спящем режиме

Я пытаюсь вызвать функцию My-SQL, которая возвращает вычисленное значение на основе входных параметров. Я использую собственные запросы для этой цели, я могу получить все поля, кроме вычисляемого поля. Я всегда получаю NULL в качестве значения для вычисляемого поля. Более того, если я выполню тот же запрос в клиенте SQL, это даст правильный результат.

Test.class

        @NamedNativeQueries({
        @NamedNativeQuery(
        name = "getTestData", 
        query = "Select test_id, BillType, Description, Material, Netvalue1, "
              + "NetValue(billType, Netvalue1) as Sales_Rs "
              + "from test1",
        resultClass = Test.class
        )
    })

    @Entity
    @Table(name="TEST1")
    public class Test {

        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue
        @Column(name="TEST_ID")
        private Integer test_id;

        @Column(name="Billtype")
        private String Billtype;

        @Column(name="Description")
        private String Description;

        @Column(name="Material")
        private String Material;

        @Column(name="Netvalue1")
        private Double Netvalue1;

        @Transient
        private Double Sales_Rs; 
// getters and setters 
.
.
.
};

Вот как я называю нативный запрос:

@SuppressWarnings("unchecked")
    @Override
    public List<Test> getAllTestData() throws MyAppException {
        List<Test> result;

        try {
            Session session = sessionFactory.getCurrentSession();

            Query query = session.getNamedQuery("getTestData");

            result = query.list();

        } catch (DataAccessException e) {
            throw new MyAppException("Could not add a new record :", e);
        }

        return result;
    }

Здесь хранится функция:

CREATE FUNCTION NetValue(billType CHAR(30), Netvalue1 DOUBLE) RETURNS double
BEGIN
    Declare RetValue DOUBLE;

  SET RetValue =
  CASE billType 
    WHEN 'A' THEN 0.10 * Netvalue1
    WHEN 'B' THEN 0.05 * Netvalue1
    WHEN 'C' THEN 0.025 * Netvalue1
    ELSE Netvalue1
  END;

    RETURN RetValue;
END;

1 ответ

Решение

Вы объявили поле Double Sales_Rs как переходный процесс, поэтому он не обрабатывается Hibernate.

Посмотрите эту тему для двух решений:

а) Используйте специфическое отображение Hibernate для расчета Sales_RS по формуле, которая вызывает вашу функцию базы данных:

@Formula("NetValue(billType, Netvalue1)")
private Double Sales_Rs; 

б) использовать JPA @Postload аннотация для расчета Sales_RS после того, как объект был загружен:

@Transient
private Double Sales_Rs;

@PostLoad
private void onLoad() {
     Sales_Rs = ... //  same logic as in your db function
}

В обоих случаях вы можете отбросить собственный запрос и использовать простой hql:

@NamedQueries({
    @NamedQuery(
       name  = "getTestData",
       query = "from Test"
)})
Другие вопросы по тегам