Java Hibernate-使用多对一注释从多表中获取数据

Java Hibernate-使用多对一注释从多表中获取数据,java,hibernate,oracle11g,Java,Hibernate,Oracle11g,我有3张桌子,大概是: 汽车 carid|carname|carPrice| 100|bmw|10L| 200|honda|5L| .. .. carType carTypeid|Type| 1|suv| 2|xuv| 3|sedan| carconfig carid|carTypeid| 100|3| 200|3| 我有所有3个表的实体 下面我粘贴了连接表的代码carconfig: @Entity @Table(name = "CARCONFIG", uniqueConstraints

我有3张桌子,大概是:

汽车

carid|carname|carPrice|
100|bmw|10L|
200|honda|5L|
..
..
carType

carTypeid|Type|
1|suv|
2|xuv|
3|sedan|
carconfig

carid|carTypeid|
100|3|
200|3|
我有所有3个表的实体

下面我粘贴了连接表的代码carconfig

@Entity
@Table(name = "CARCONFIG", uniqueConstraints = { 
        @UniqueConstraint(columnNames = { "carId" } )
})
public class Carconfig {

    @Id
    long carId;

    @OneToOne
    @JoinColumn(name = "carId", insertable = false, updatable = false)
    Car car;

    @ManyToOne(optional = false)
    @JoinColumn(name = "carTypeId")
    CarType carType;

    public Carconfig() {
        super();
    }

    public Carconfig(long carId, CarType carType) {
        super();
        this.carType = carType;
        this.carId = carId;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public CarType getCarType() {
        return carType;
    }

    public void setCarType(CarType carType) {
        this.carType = carType;
    }

    public long getCarId() {
        return carId;
    }

    public void setCarId(long carId) {
        this.carId = carId;
    }

}
我的问题是:

我想知道如何从表carcarType中获取数据并将其写入csv

下面是获取数据的代码

public String downloadcars(CarForm form, Model model,HttpServletRequest request, HttpServletResponse response)throws IOException {
        PrintWriter pw = null;

        try {
            logger.debug("+++++++++++++++++++++++++++++++++++++++");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-disposition","attachment; filename=car" + ".csv");
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control","must-revalidate, post-csheck=0, pre-check=0");
            response.setHeader("Pragma", "public");
            pw = response.getWriter();
            // Get, Write and flush the data.
            pw.println(" Id,Name,Price,Type");
            List<car> carFromDB = Collections.emptyList();



            for (Car car : carFromDB) {             
                pw.println(String.format("%s,%s,%s,%s,%s",
             // this is where i need help

            }
            pw.flush();

        } catch (Exception ex) {
            logger.error("Error while downloading car", ex);
            model.addAttribute("failureMsg","Error while downloading cars");
        }
        return null;
    }
publicstringdownloadcars(CarForm表单、模型模型、HttpServletRequest请求、HttpServletResponse响应)抛出IOException{
PrintWriter pw=null;
试一试{
logger.debug(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”;
response.setContentType(“application/vnd.ms excel”);
setHeader(“内容处置”、“附件;文件名=car”+”.csv”);
response.setHeader(“Expires”、“0”);
setHeader(“缓存控制”,“必须重新验证,后csheck=0,预检查=0”);
响应。setHeader(“Pragma”、“public”);
pw=response.getWriter();
//获取、写入和刷新数据。
打印号(“Id、名称、价格、类型”);
List carFromDB=Collections.emptyList();
对于(Car-Car:carFromDB){
println(String.format(“%s,%s,%s,%s,%s”,
//这就是我需要帮助的地方
}
pw.flush();
}捕获(例外情况除外){
logger.error(“下载汽车时出错”,例如);
model.addAttribute(“failureMsg”,“下载汽车时出错”);
}
返回null;
}

您只需使用带有连接查询的HQL即可,如下所示:

List<Object[]> carsWithDetails = session.createQuery(
    "select distinct car.carid, car.carname, car.carPrice, cartype.Type " +
    "from Car  car join car.carType cartype ")
    .list();
List<Object[]> carsWithDetails = session.createQuery(
    "select distinct car.carid, car.carname, car.carPrice, cartype.Type " +
    "from Car  car join car.carType cartype join car.carConfig carConfig")
    .list();
当然,根据需要更改循环,添加要写入
CSV
的代码,而不是
System.out.println

它将替换此循环:

for (Car car : carFromDB) {             
            pw.println(String.format("%s,%s,%s,%s,%s",
         // this is where i need help

        }
编辑:

如果要联接所有三个表,只需向查询中添加联接引用
join car.carConfig carConfig
,如下所示:

List<Object[]> carsWithDetails = session.createQuery(
    "select distinct car.carid, car.carname, car.carPrice, cartype.Type " +
    "from Car  car join car.carType cartype ")
    .list();
List<Object[]> carsWithDetails = session.createQuery(
    "select distinct car.carid, car.carname, car.carPrice, cartype.Type " +
    "from Car  car join car.carType cartype join car.carConfig carConfig")
    .list();
List carsWithDetails=session.createQuery(
选择不同的car.carid、car.carname、car.carPrice、cartype.Type+
“从Car Car join Car.carType carType join Car.carConfig carConfig”)
.list();

获取数据的代码在哪里?。有问题的是,没有一行显示获取数据。你可以使用
标准API
或HQL从数据库获取数据,你可以使用
Apache POI
创建csv/excel文件。你能解释一下你使用的HQL吗?我是HQL的新手,不太明白我的意思t、 对于出现的问题,我们深表歉意。在下面的查询中,我们对一些列使用了select,这些列的别名为
car
for
car
class和
carType
for
carType
,并在两个表之间使用了
join
。明白了!但是,您能展示一下我能不能将所有3个表car carType和carconfig连接起来吗?谢谢非常感谢!