【问题标题】:Retrieving details from multiple tables using SpringMVC使用 Spring MVC 从多个表中检索详细信息
【发布时间】:2015-05-12 10:13:00
【问题描述】:

我正在开发一个购物应用程序,在我的应用程序中,我有表租户,在租户表中,我有列 Binary_id,它是数据库中二进制表中的主键。现在,当我向租户表发出获取请求时,我将所有租户表字段作为 JSON 获取。但是我有从二进制表到租户的@ManyToOne 关系,即租户可以有多个二进制记录。因此,在从 POSTMAN 客户端进行 GET 调用而不是获取租户详细信息时,我需要以 JSON 格式获取与该租户相关的所有二进制记录。

现在我在从 POSTMAN 客户端调用 http://localhost:8080/sportsmvc/rest/tenant 时得到如下 JSON

[
{
"id": 2,
"binaryId": "1002",
"name": "AltisArena"
},
{
"id": 9,
"binaryId": "1001",
"name": "Agon"

} ]

但我需要响应 JSON 如下:

      [
    {
        "id": 2,
        "name": "AltisArena",
        "listOfBinary": [
            {
                "tenant_id": 2,
                "location": "location1",
                "description": "ABC"
            },
            {
                "tenant_id": 2,
                "location": "location2",
                "description": "ABCD"
            }
        ]
    },
    {
        "id": 9,
        "name": "Agon",
        "listOfBinary": [
            {
                "tenant_id": 9,
                "location": "location3",
                "description": "desc1"
            },
            {
                "tenant_id": 9,
                "location": "location4",
                "description": "desc2"
            }
        ]
    }
]

代码sn-ps:

租户实体:

    @Entity
@Table(name="tenant", catalog="db_sports" )
// Define named queries here
@NamedQueries ( {
  @NamedQuery ( name="TenantEntity.countAll", query="SELECT COUNT(x) FROM TenantEntity x" )
} )
public class TenantEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    //----------------------------------------------------------------------
    // ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
    //----------------------------------------------------------------------
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", nullable=false)
    private Integer    id           ;
    @Column(name="name", nullable=false, length=300)
    private String     name         ;

   //----------------------------------------------------------------------
   // ENTITY LINKS ( RELATIONSHIP )
   //----------------------------------------------------------------------
   @ManyToOne
   @JoinColumn(name="binary_id", referencedColumnName="id")
   private SwaBinaryEntity swaBinary   ;

SWA_Binary 实体:

       @Entity
@Table(name="SWA_Binary", catalog="db_sports" )
// Define named queries here
@NamedQueries ( {
  @NamedQuery ( name="SwaBinaryEntity.countAll", query="SELECT COUNT(x) FROM SwaBinaryEntity x" )
} )
public class SwaBinaryEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    //----------------------------------------------------------------------
    // ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
    //----------------------------------------------------------------------
    @Id
    @Column(name="id", nullable=false, length=100)
    private String     id           ;

    @Column(name="file_location", nullable=false, length=400)
    private String     fileLocation ;

    @Column(name="description", nullable=false, length=200)
    private String     description  ;

TenantRestController:

   @RequestMapping( value="/tenant",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public List<Tenant> findAll() {
    return tenantService.findAll();
}

TenantServiceImpl:

@Override
public List<Tenant> findAll() {
    List<TenantEntity> entities = tenantPersistence.loadAll();
    List<Tenant> beans = new ArrayList<Tenant>();
    for(TenantEntity entity : entities) {
        beans.add(tenantServiceMapper.mapTenantEntityToTenant(entity));
    }
    return beans;
 }

租户服务映射器:

public Tenant mapTenantEntityToTenant(TenantEntity tenantEntity) {
    if(tenantEntity == null) {
        return null;
    }

    //--- Generic mapping 
    Tenant tenant = map(tenantEntity, Tenant.class);

    //--- Link mapping ( link to SwaBinary )
    if(tenantEntity.getSwaBinary() != null) {
        tenant.setBinaryId(tenantEntity.getSwaBinary().getId());
    }
    return tenant;
}

谁能帮忙解决这个问题。

提前致谢。

【问题讨论】:

  • 为什么不向实体添加@ManyToOne 关系?
  • @Jens 感谢重播。抱歉忘记添加,我编辑了 TenantEntity 类。
  • 尝试添加@ManyToOne (cascade = CascadeType.ALL)
  • @Jens 得到与以前相同的响应。

标签: json spring hibernate spring-mvc


【解决方案1】:

也许我误解了模型,但它似乎有点错误。在您需要 JSON 的情况下,您的租户有多个二进制文件,但在 JPA 模型中反之亦然,租户有 1 个二进制文件。

在TenantEntity中不应该是这样的吗?:

@OneToMany
private List<SwaBinaryEntity> swaBinary 

【讨论】:

  • 感谢重播。一旦我会检查并让你知道
  • 如您所说更改注释。但只获取与租户相关的 JSON。没有得到与租户相关的二进制表记录
  • 您是否在tenantService.findAll() 方法中使用数据填充所有二进制文件?因为看起来您返回的不是持久实体。
  • 我编辑了我的帖子,最后添加了 findAll() 实现。有什么问题吗?
  • 需要深入研究。方法tenantServiceMapper.mapTenantEntityToTenant(entity) 是否迭代租户的二进制文件?
猜你喜欢
  • 2020-04-15
  • 2020-08-28
  • 2017-10-11
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多