【问题标题】:How to Serialize an Attribute but dont persist it using spring data?如何序列化属性但不使用弹簧数据持久化?
【发布时间】:2025-12-13 13:50:08
【问题描述】:

我正在研究 Spring Data + JPA,并创建了如下查询:

public interface GroupRepository extends JpaRepository<Group, Integer> {
    @Query("SELECT g.group, sum(ball) as sum from person ... group by ...", nativeQuery=false)
    List<Group> BallPerGroup();
}

返回是:

sum    |     group
10     |   group 1
5      |   group 2
6      |   group 3

我有一个实体组:

public class Group{
    @Id @Genera...
    private Integer id;
    private String group;

    //getters and setter

}

我有一个实体人:

public class Person{
    @Id @Genera...
    private Integer id;
    private String name;
    private Integer ball;

    @OneToMany
    private Group group;


    //getters and setter

}

我想要一个名为 sum 的属性,即 spring 数据可以序列化但不能持久化。简而言之,我不想在我的数据库中看到“总和”列。

我已经尝试过@transient,但它为空。

我该怎么做?

【问题讨论】:

  • 显示存储库方法签名
  • 您可以使用 DB 视图或 Provider 扩展(例如 Hibernate 的 @Formula 注释),如此答案中所述:*.com/questions/43407889/…

标签: java spring jpa spring-data jpql


【解决方案1】:

将该类更改为interface,然后像这样声明您的方法

    public interface GroupInterface { 
privte String groupName; 
private Long sum
}

....

@Query(SELECT sum(a) as sum, groupNameColumn as groupName from ... inner join group ... group by ...
public List<GroupInterface> getMyResults(add some arguments if needed)

注意查询必须返回 2 列

【讨论】:

  • 我不想为那个(接口)创建一个数据持有者......我想在组实体中添加一个属性,但不要持久化它并在可用时序列化
  • 你想要的是做一个投影,这就是你在spring数据中做投影的方式。您可以上山并为@Query(SELECT new full.qualified.name.of.class(sum as sum, ..... other arguments)使用适当的构造函数@
  • 你是说不可能有一个可以序列化但不能持久化的属性?
  • 它与@Transient(或省略@Column)一起使用,但不会像您希望的那样被初始化。 它不会像您想要的那样持续存在,但是您真正想要的是从查询投影中获取价值,而这种方式不会起作用。唯一的方法是使用自定义构造函数和SELECT new .... 表达式,但恕我直言,这太棒了
  • 我在发帖之前已经考虑过了...但在我看来,为它创建一个数据存储文件是如此昂贵...。
【解决方案2】:

感谢@Antoniossss!编辑他的答案:

你想要的是做一个投影,这就是你做的方式 春季数据中的预测。您可以上那座山并使用适当的 构造函数:

@Query(SELECT new full.qualified.name.of.class(sum as sum, ..... other arguments) from ...)

这就是我所做的并按预期工作。

所以,我添加了一个带有@transient 注释的属性:

public class Group{
    @Id @Genera...
    private Integer id;
    private String group;

    @Transient
    private Integer sum;

    //getters and setter

}

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 这正是我所做的...@Query(SELECT new full.qualified.name.of.class(sum as sum, ..... other arguments) from ... ) 并添加带有@transient 注释的属性: