【问题标题】:Spring data jdbc - Specific join, specific mappingSpring data jdbc - 具体的join,具体的映射
【发布时间】:2019-11-29 16:44:15
【问题描述】:

我有以下两个表:

Customer
id
name

Order
id
product_name
customer_id

一对一的关系

和java实体:

@Data
public class Customer{
    @Id
    private Long id;
    private String name;
}

@Data
public class Order{
    @Id
    private Long id;

    @Column("id")
    private Customer customer; //i want to somehow map this
    private String productName;
}

还有一个控制器

@Controller
public class MyController{
    //...
    @GetMapping("/")
    public String getmap(Model m){
        System.out.println(repository.findAll()) //prints "nullrows" due to wrong sql statement
        return "mytemplate";
    }
}

我当前的问题是,spring 正在执行以下 sql 语句:

SELECT Order.id, Order.product_name, Customer.id, Customer.name
FROM Order LEFT OUTER JOIN Customer ON Customer.id = Order.id

我真正想要的是加入Customer.id = Order.customer_id,同时保持课程不变,即客户参考需要保持秩序。

我已经尝试了迄今为止我能找到的所有注释,但没有取得任何进展。

编辑:

我不允许使用 jpa/hibernate

【问题讨论】:

  • Order和Customer是什么关系?
  • 目前1对1
  • SQL语句什么时候执行
  • 在我的控制器中调用“repository.findAll()”时

标签: java spring spring-data spring-jdbc


【解决方案1】:

一种解决方法是执行以下操作:

@Data
public class Customer{
    @Id
    private Long id;
    private String name;
}

@Data
public class Order{
    @Id
    private Long customerId;

    private Long id;

    @Column("id")
    private Customer customer; //i want to somehow map this
    private String productName;
}

导致它自动加入Customer.id = Order.customer_id

但这看起来不是一个好的解决方法。

【讨论】:

    【解决方案2】:

    您可以为一对一关系使用 @OneToOne@JoinColumn 注释:

    @Data
    public class Customer{
        @Id
        @Column(name = "id")
        private Long id;
    
        @Column(name = "name")
        private String name;
    
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "order_id", referencedColumnName = "id") 
        private Order order;
    }
    
    @Data
    public class Order{
        @Id
        @Column(name = "id")
        private Long id;
    
        @Column(name = "product_name")
        private String productName;
    
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "customer_id", referencedColumnName = "id")  
        private Customer customer;
    }
    

    【讨论】:

    • 那是用hibernate不是吗?
    • 您可以将 spring 数据与您选择的持久性提供程序一起使用(hibernate 是最流行的一种),但 OneToOne 注释不是 hibernate 它是 java 的一部分:en.wikibooks.org/wiki/Java_Persistence/OneToOne
    • 哦,是的。但这仍然是jpa。我不允许使用 jpa
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多