Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中处理命名本机查询中的额外字段_Java_Sql_Hibernate_Postgresql_Jpql - Fatal编程技术网

Java 如何在Hibernate中处理命名本机查询中的额外字段

Java 如何在Hibernate中处理命名本机查询中的额外字段,java,sql,hibernate,postgresql,jpql,Java,Sql,Hibernate,Postgresql,Jpql,我有一个命名的本机查询: @NamedNativeQueries({ @NamedNativeQuery( name = "WeightLog.getAll", query = "select weightLogId, dateOfLog, weight, weight - lag(weight) over (ORDER BY dateOfLog) as change, userId from weightLog order by date

我有一个命名的本机查询:

@NamedNativeQueries({
    @NamedNativeQuery(
            name = "WeightLog.getAll",
            query = "select weightLogId, dateOfLog, weight, weight - lag(weight) over (ORDER BY dateOfLog) as change, userId from weightLog order by dateOfLog desc",
            resultClass = WeightLog.class)})
其中,我使用lag命令显示了与本列中最后一个条目的差异

在实体中处理此问题的正确方法是什么,以便在执行get时可以将其返回到UI,但在执行创建/更新/删除时将忽略它

我所做的是这样注释它:

@Column(insertable = false, updateable=false)
private Double change;
这意味着在getAll期间,它将显示在从REST端点返回的JSON中,并且在执行创建/更新时将被忽略。然而,由于这个原因,我无法通过相应的REST端点从by DB中删除,正如在我的DAO中的by delete方法中一样,我使用get,它将返回“更改”

删除DAO中的方法:

public WeightLog getById(final Long weightLogId){
    return get(weightLogId);
}

public Long deleteById(final Long weightLogId){
    final WeightLog weightLogToDelete = this.getById(weightLogId);
    this.delete(weightLogToDelete);
    return weightLogToDelete.getWeightLogId();
}

private void delete(final WeightLog weightLog){
    currentSession().delete(weightLog);
}
例外情况是:

错误[2016-04-18 21:06:32365]io.dropwizard.jersey.errors.LoggingExceptionMapper:处理请求时出错:1f50d70af5fc5606 ! org.postgresql.util.PSQLException:错误:列weightlog0\u0.change不存在 ! 职位:51

@瞬态是不好的,它似乎会被忽略的两种方式,然后将不会出现任何积垢操作

我认为我上面所说的是完全错误的方式,只是一种“黑客”方式,我可以自由地告诉我我所做的是完全错误的,并为我指明了正确的方向,如何处理这种使用滞后的情况。如果可能的话,我更愿意使用注释

为选项一进行编辑

下面是Dimitri的第一个选项,说明返回到UI的json数据的格式:

[
{
  "weightLogId": 15,
  "dateOfLog": "2016-04-30",
  "weight": 55,
  "userId": 1
},
-31.7]
自行更改,不附带任何名称。这使得很难将此属性打印到屏幕上。否?我在前端使用主干,无法调用model.attribute或model.get('attribte')。对于我的旧感冒,格式应该是:

{
  "weightLogId": 5,
  "dateOfLog": "2016-03-13",
  "weight": 87.5,
  "userId": 1,
  "change": 0
}
无论如何,我可以得到结果映射中给出的“名称”显示在这里吗

它实际上完全弄乱了JSON格式,因为现在属性位于一层以下的对象中,现在与UI上的主干模型格式不匹配,即:

defaults: {
        weight: 0,
        dateOfLog: "2016-01-01",
        userId: 1,
        change: "0"
    },
作为参考,使用的结果映射为:

@SqlResultSetMapping(
    name = "WeightLogWithChange",
    entities = {
            @EntityResult(
                    entityClass = WeightLog.class,
                    fields = {
                            @FieldResult(name = "weightLogId", column = "weightLogId"),
                            @FieldResult(name = "userId", column = "userId"),
                            @FieldResult(name = "dateOfLog", column = "dateOfLog"),
                            @FieldResult(name = "weight", column = "weight")
                    }),
    },
    columns = @ColumnResult(name = "change", type = Double.class)
)

编辑选项2

对于选项2,命名查询将如何更改

@NamedNativeQueries({
    @NamedNativeQuery(
            name = "WeightLog.getAll",
            query = "select weightLogId, dateOfLog, weight, weight - lag(weight) over (ORDER BY dateOfLog) as change, userId from weightLog order by dateOfLog desc",
            resultSetMapping = "WeightLogWithChange"
    )
})


这里它包含滞后SQL。如果将滞后部分移动到属性上方的公式中,那么该命名查询将如何更改?我假设这里的滞后部分需要删除?

如果我理解正确,您希望执行查询时
change
属性可见,但在删除/更新/插入操作中不可见

解决方案1

一种方法是单独处理此参数,而不是将其作为实体属性,但仍将其保持在使用JPA功能的实体附近,即
@SqlResultSetMapping
()

使用新的映射注释(忽略所有其他注释)时,实体将如下所示:

本机查询的调用将是:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

List<Object[]> results = em.createNativeQuery("select weightLogId, dateOfLog, weight, weight - lag(weight) over (ORDER BY dateOfLog) as change, userId from weightLog order by dateOfLog desc", "WeightLogWithChange").getResultList();

results.stream().forEach((result) ->  {
   log.info("This is my weightLog object:" + result[0] + " and this is my computed change stored in a separate var: " + result[1]);
});

em.getTransaction().commit();
em.close();

如果我理解正确,您希望
change
属性在执行查询时可见,但在删除/更新/插入操作中不可见

解决方案1

一种方法是单独处理此参数,而不是将其作为实体属性,但仍将其保持在使用JPA功能的实体附近,即
@SqlResultSetMapping
()

使用新的映射注释(忽略所有其他注释)时,实体将如下所示:

本机查询的调用将是:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

List<Object[]> results = em.createNativeQuery("select weightLogId, dateOfLog, weight, weight - lag(weight) over (ORDER BY dateOfLog) as change, userId from weightLog order by dateOfLog desc", "WeightLogWithChange").getResultList();

results.stream().forEach((result) ->  {
   log.info("This is my weightLog object:" + result[0] + " and this is my computed change stored in a separate var: " + result[1]);
});

em.getTransaction().commit();
em.close();

嗨,迪米特里,谢谢你的回答。我已经尝试了您的第一个选项,但是现在返回到UI的json数据格式不好。我会用细节更新问题。@caseball如果你觉得这个答案有帮助,你可以投票和/或接受它。关于json问题——它与hibernate没有直接关系,是吗?这很可能是一个单独的问题,只关注这一方面。我已经接受了这个问题的答案,但我无法投票,因为我没有足够的声誉。我认为JSON部分是有效的,我不想为了获取属性(如果属性可用,我可以这样做),我想学习如何正确地执行此操作,以便查询以正确的格式返回,然后以正确的格式返回到UI。鉴于旧的查询(有问题)能够返回正确的格式,我想一定有办法使用ResultMapping来执行这个新的“查询”以同时返回正确的格式。嗨,Dimitri,谢谢你的回答。我已经尝试了您的第一个选项,但是现在返回到UI的json数据格式不好。我会用细节更新问题。@caseball如果你觉得这个答案有帮助,你可以投票和/或接受它。关于json问题——它与hibernate没有直接关系,是吗?这很可能是一个单独的问题,只关注这一方面。我已经接受了这个问题的答案,但我无法投票,因为我没有足够的声誉。我认为JSON部分是有效的,我不想为了获取属性(如果属性可用,我可以这样做),我想学习如何正确地执行此操作,以便查询以正确的格式返回,然后以正确的格式返回到UI。考虑到旧查询(有问题)能够返回正确的格式,我认为一定有一种方法可以使用ResultMapping执行这个新的“查询”,以同时返回正确的格式。
//you have to check the validity of the SQL
@Formula("(select weight - lag(weight) over (ORDER BY dateOfLog) from weightLog wl where wl.id = id)")
private Double change;