在JPA查询之后返回自定义实体

时间:2015-02-01 13:55:38

标签: java spring hibernate jpa

我正在使用Hibernate进行SQL查询。获得MyEntity bean列表后,我想创建一个CustomEntity bean列表,其中包含与MyEntity相同的数据,但只包含我想要的字段。我想创建这个CustomEntity,因为我不想将所有信息发送回客户端,但是当我从数据库中检索时,我想要检索所有信息。我不想在查询中选择列。实现此CustomEntity bean并将值加载到其中的正确模式是什么?

3 个答案:

答案 0 :(得分:0)

一种方法是编写一个转换器,它将获取您的实体列表并将其转换为客户实体并返回该对象。另一种方法是使用继承(hibernate继承)然后触发相同的查询,但我认为在你的情况下它不是必需的所以我会采用第一种方法。我猜这里是你需要在视图上显示这个自定义对象。如果这是您正在这样做的原因,那么您应该使用DTO并编写一个转换器,将您的实际实体转换为自定义实体。

以下是一些链接Wiki DTO& Transfer Object Pattern

答案 1 :(得分:0)

我认为只有当你有一个新的Entity CustomEntity(带有必需的列)时你才能这样做。例如

<强> myEntity所

class MyEntity{

private long id;

private String att1;

private String att2;

}

如果您只想在CustomEntity中使用att1,那么您必须创建

<强> CustomEntity

 class CustomEntity{

    private long id;

    private String att1;

   }

然后在你的控制器中获取MyEntity的所有列表,然后创建像

这样的CustomEntity
    List<MyEntity> me=MyEntity.all();  //return List of MyEntity

    for(MyEntity m:me){

    CustomEntity cm=new CustomEntity();

    cm.setAtt1(m.getAtt1);              //setter and getter

    CustomEntity.create(cm);            //create method of CustomEntity
    }

   List<CustomEntity> cmList=CustomEntity.all();  //get List of all Customentity

然后,如果您已完成,则可以删除所有CustomEntity

答案 2 :(得分:0)

如果这是关于过滤JSON响应的某些属性,您可以简单地在您不想序列化的字段上添加一些@JsonIgnore注释。对于您可能希望以不同方式序列化同一对象的多个响应,这通常是不够的。

确实有一种解决方案是为每个响应创建DTO,并将其与Jackson一起使用。 A&#34;简单&#34; for循环并创建所需的对象。这在例如json序列化中不必处理双向的方式是万无一失的,但它可能需要您生成大量代码。

另一种方式是JsonViews,您可以在其中定义要序列化的内容。我不能告诉你很多,因为我从未使用它。

我最喜欢的方式是JsonFilter。这与视图类似,但只有&#34;只有&#34; jackson中一个非常基本的实现,允许对特定类进行过滤。

就在昨天,我创建了一个github项目,该项目应该基于绝对路径处理过滤。 (蚂蚁风格) 这是链接。可能它满足了你的需求。

https://github.com/Antibrumm/jackson-antpathfilter

如果你直接处理视图层中的hibernate实体,你可能需要`OpenEntityManagerInViewInterceptor&#39;避免使用LazyLoadingExceptions。