请帮助我使用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.idI 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.newsItemsYou 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.
更多推荐
发布评论