Hibernate查询机器(Hibernate query machine)

编程入门 行业动态 更新时间:2024-10-28 19:20:00
Hibernate查询机器(Hibernate query machine)

请帮助我使用hibernate查询机器。 我有2张桌子

CREATE TABLE public.news_category_dict ( id SERIAL PRIMARY KEY NOT NULL, name VARCHAR(64) NOT NULL ); CREATE UNIQUE INDEX news_category_dict_name_uindex ON public.news_category_dict (name); CREATE TABLE public.news ( id SERIAL PRIMARY KEY NOT NULL, category_id INT2, name VARCHAR(64) NOT NULL, created TIMESTAMP DEFAULT now() NOT NULL, data TEXT NOT NULL ); CREATE UNIQUE INDEX news_name_uindex ON public.news (name); ALTER TABLE public.news ADD CONSTRAINT news_news_category_dict_id_fk FOREIGN KEY (category_id) REFERENCES news_category_dict (id) ON UPDATE CASCADE;

它们是链接的,所以我想要这个查询

SELECT d.name, n.name, n.data FROM public.news AS n, public.news_category_dict AS d WHERE n.category_id = d.id

我知道如何在SQL中执行此操作,但不了解如何在HQL和With Criteria API中执行此操作。

帮我PLZ。

编辑

好。 这是我的映射:

public class News implements Serializable { private int id; private String name; private Date created; private String data; private NewsCategoryDict category; } public class NewsCategoryDict implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private List<News> news = new ArrayList<>(); }

当我使用这个片段时:

Criteria crit = sessionFactory.getCurrentSession().createCriteria(News.class); return crit.list();

我通过跟踪看到的这个SQL脚本:

select this_.id as id1_4_0_, this_.category_id as category5_4_0_, this_.created as created2_4_0_, this_.data as data3_4_0_, this_.name as name4_4_0_ from news this_

我也希望看到类别NAME字段。

Please help me with hibernate query machine. I have 2 tables

CREATE TABLE public.news_category_dict ( id SERIAL PRIMARY KEY NOT NULL, name VARCHAR(64) NOT NULL ); CREATE UNIQUE INDEX news_category_dict_name_uindex ON public.news_category_dict (name); CREATE TABLE public.news ( id SERIAL PRIMARY KEY NOT NULL, category_id INT2, name VARCHAR(64) NOT NULL, created TIMESTAMP DEFAULT now() NOT NULL, data TEXT NOT NULL ); CREATE UNIQUE INDEX news_name_uindex ON public.news (name); ALTER TABLE public.news ADD CONSTRAINT news_news_category_dict_id_fk FOREIGN KEY (category_id) REFERENCES news_category_dict (id) ON UPDATE CASCADE;

They are linked, so I want this query

SELECT d.name, n.name, n.data FROM public.news AS n, public.news_category_dict AS d WHERE n.category_id = d.id

I know how to do it in SQL, but don't understand how to do it in HQL and With Criteria API.

Help me PLZ.

EDIT

Ok. Here are my mappings:

public class News implements Serializable { private int id; private String name; private Date created; private String data; private NewsCategoryDict category; } public class NewsCategoryDict implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private List<News> news = new ArrayList<>(); }

When I use this snippet:

Criteria crit = sessionFactory.getCurrentSession().createCriteria(News.class); return crit.list();

this SQL script I saw with tracing:

select this_.id as id1_4_0_, this_.category_id as category5_4_0_, this_.created as created2_4_0_, this_.data as data3_4_0_, this_.name as name4_4_0_ from news this_

And I want to see category NAME field too.

最满意答案

你需要两个实体

@Entity public class NewsDict { @Id @GeneratedValue private Integer id; @Column private String name; @OneToMany(mappedBy = "newsDict") private List<NewsItem> newsItems; } @Entity public class NewsItem { @Id @GeneratedValue private Integer id; @Column private String name; @Column private String data; @ManyToOne(fetch = FetchType.LAZY) private NewsDict newsDict; }

HQL

from NewsDict dict left join fetch dict.newsItems

您可以将获取newsItems更改为eager

@OneToMany(mappedBy = "newsDict", fetch = FetchType.EAGER) private List<NewsItem> newsItems;

并使用Criteria做同样的事情

List<NewsDict> result = session.createCriteria(NewsDict.class).list();

或者你可以使用带有延迟提取的Criteria#setFetchMode() 。

要使用NewsItem获取NewsDict ,您可以使用急切加载

@ManyToOne private NewsDict newsDict;

或Criteria#setFetchMode() ,或具有left join fetch HQL。

这只是一个例子。 它不适用于您的架构。 您需要稍微改变一下。

You need two entities

@Entity public class NewsDict { @Id @GeneratedValue private Integer id; @Column private String name; @OneToMany(mappedBy = "newsDict") private List<NewsItem> newsItems; } @Entity public class NewsItem { @Id @GeneratedValue private Integer id; @Column private String name; @Column private String data; @ManyToOne(fetch = FetchType.LAZY) private NewsDict newsDict; }

HQL

from NewsDict dict left join fetch dict.newsItems

You can change fetching newsItems to eager

@OneToMany(mappedBy = "newsDict", fetch = FetchType.EAGER) private List<NewsItem> newsItems;

and do the same with Criteria

List<NewsDict> result = session.createCriteria(NewsDict.class).list();

or you can use Criteria#setFetchMode() with a lazy fetching.

To get NewsDict with NewsItem you can use an eager loading

@ManyToOne private NewsDict newsDict;

or Criteria#setFetchMode(), or HQL with left join fetch.

It is just an example. It will not work with your schema. You will need to change it a bit.

更多推荐

本文发布于:2023-08-03 01:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1382535.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:机器   Hibernate   machine   query

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!