Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何进行Hibernate嵌套选择?_Java_Hibernate - Fatal编程技术网

Java 如何进行Hibernate嵌套选择?

Java 如何进行Hibernate嵌套选择?,java,hibernate,Java,Hibernate,我不确定我的问题措辞是否正确,但我正在使用postgres数据库 我正在寻找以下sql语句的等效语句 在中选择*从track where id从track\u item where item\u time在x和y之间选择track\u id 我不熟悉hibernate,我尝试过使用hibernate查询和条件来实现这一点,但都失败了 如果有一个awnser同时使用这两种方法,那么最好看到这两个示例,因为我正在尝试学习如何同时使用这两种方法 这是两个表的创建表信息 CREATE TABLE tra

我不确定我的问题措辞是否正确,但我正在使用postgres数据库

我正在寻找以下sql语句的等效语句

在中选择*从track where id从track\u item where item\u time在x和y之间选择track\u id

我不熟悉hibernate,我尝试过使用hibernate查询和条件来实现这一点,但都失败了

如果有一个awnser同时使用这两种方法,那么最好看到这两个示例,因为我正在尝试学习如何同时使用这两种方法

这是两个表的创建表信息

CREATE TABLE track (
id bigint NOT NULL,
track_uuid text,
track_number text,
track_exercise_indicator_id bigint NOT NULL,
track_simulation_indicator_id bigint NOT NULL,
track_status_id bigint,
last_modified timestamp with time zone DEFAULT timezone('utc'::text, now())
);

CREATE TABLE track_item (
id bigint NOT NULL,
track_item_type_id bigint NOT NULL,
item_time bigint NOT NULL,
frame_number bigint,
image_source text,
last_modified timestamp with time zone DEFAULT timezone('utc'::text, now()),
track_item_uuid character varying(200) NOT NULL,
track_id bigint NOT NULL
);

ALTER TABLE ONLY track_item
ADD CONSTRAINT track_item_track_id_fkey FOREIGN KEY (track_id) REFERENCES track(id);

ALTER TABLE ONLY track_item
ADD CONSTRAINT track_item_track_item_type_id_fkey FOREIGN KEY (track_item_type_id) REFERENCES track_item_type(id);
从上表生成的java类是

@Entity
@Table(name = "track", schema = "d2d")
public class Track implements java.io.Serializable {

/**
 * ID.
 */
private static final long serialVersionUID = 2313376497269789747L;
private long id;
private TrackSimulationIndicator trackSimulationIndicator;
private TrackStatus trackStatus;
private TrackExerciseIndicator trackExerciseIndicator;
private String trackUuid;
private String trackNumber;
private Date lastModified;
private Set<TrackMessageToTrackMapping> trackMessageToTrackMappings = new HashSet<TrackMessageToTrackMapping>(
        0);
private Set<TrackInterval> trackIntervals = new HashSet<TrackInterval>(0);
private Set<AnomalyToTrackMapping> anomalyToTrackMappings = new HashSet<AnomalyToTrackMapping>(
        0);
}




 @Entity
 @Table(name = "track_item", schema = "d2d")
 public class TrackItem implements java.io.Serializable {

/**
 * ID.
 */
private static final long serialVersionUID = 8469898950069782997L;
private long id;
private TrackItemType trackItemType;
private long itemTime;
private Long frameNumber;
private String imageSource;
private String trackItemUUID;
private Track track;
private Date lastModified;
private Set<TrackPoint> trackPoints = new HashSet<TrackPoint>(0);
private Set<TrackInformation> trackInformations = new HashSet<TrackInformation>(
        0);
}

您的查询应该使用联接,以提高效率,并更容易在HQL中进行翻译:

select distinct t.* from track t
inner join track_item item on t.id = item.track_id
where item.item_time between 100 and 200
此SQL查询将转换为HQL,如下所示:

select distinct t from Track t 
inner join t.items item
where item.time between 100 and 200
在标准方面:

Criteria c = session.createCriteria(Track.class, "t");
c.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY);
c.createAlias("t.items", "item");
c.add(Restrictions.between("item.time", 100L, 200L);
编辑:

您已将该关联映射为从TrackItem到Track的多通关联。从Track到TrackItem的反向OneToMany关联不存在,因此上述查询将不起作用。不过,以下HQL将起作用:

select distinct t from Item item 
inner join item.track t
where item.time between 100 and 200

但是,您无法将这样的查询转换为条件,因此您最好使关联具有双向性:没有理由让曲目不知道其项目。

我的一位同事提出了以下条件解决方案,该方案在以下条件下有效。一旦HQL语句更新了表名和对itemTime的引用,HQL语句的解决方案JB Nizet就可以工作。HQL查询也发布在本文档的底部

 /**
 * @param p_startTime The date and time in ms
 * @param p_endTime The date and time in ms
 * @param p_session the session
 * @return Returns the latest valid rule for the specified date time
 * @throws IOException
 */
@SuppressWarnings("unchecked")
public static List<Track> loadAllTracksByDateRange(final long p_startTime,
        final long p_endTime, final Session p_session) throws IOException {


    // create the criteria
    final Criteria criteria = p_session.createCriteria(TrackItem.class);


    // set projection
    criteria.setProjection(Projections.distinct(Projections
            .property("track")));


    // add the restriction
    criteria.add(Restrictions.ge("itemTime", p_startTime));
    criteria.add(Restrictions.le("itemTime", p_endTime));


    return criteria.list();
}

可以使用DetachedCriteria类进行嵌套选择:

看看问题 和 和hibernate文档
关于细节

我认为对跟踪表中的内容存在混淆。曲目表本身中的任何内容都与曲目表中除曲目id以外的内容无关。这是一种1对多的关系。行c.createAliast.items、item无效,因为跟踪表不包含名为items的列。轨迹表包含上述三个字段。尽管如此,这两个查询都不起作用。使用条件的示例返回一个空列表,HQL查询状态无法从查询中解析propery:item of:database.model.Track。我注意到hibernate非常区分大小写,因此更多信息可能会有所帮助。数据库中的实际表名是track和track\u item。我注意到大多数hibernate引用的反向工程.java类是Track和TrackItem。Track.java中的重要变量是int id,TrackItem.java中的变量是long itemTime和Track Track。您没有提供实体的代码,所以我不得不猜测类和属性的名称。您不应该将itemTime命名为属于名为TrackItem的类的属性。这是多余的。关于你的第二条评论,我不明白你所说的超过=符号的所有内容都返回超过1条记录是什么意思。如果您的意思是它返回重复项,那么请使用select distinct而不是select。请注意,您更高效的查询是对“我的查询”的错误翻译,因为在您尝试执行它时,它包含错误。子句条目表项中缺少错误每个轨道包含两个轨道项,它们以不同的轨道项类型同时出现,因此我要查找的是在给定时间约束期间发生的所有轨道的列表,我的原始查询将返回该列表。我将发布每个表的创建表,以帮助每个人理解。通过阅读第一个问题,您在hibernate中将标准和分离标准之间的差异联系起来,我得到的印象是您应该避免分离标准。另外,虽然我已经有了一个解决方案,但我想看看你的解决方案是否有效,它不会抛出任何错误,但它返回一个空列表。一般来说,你应该避免它,是的,但有时它可能是一个合适的选择,这取决于你的需求和/或设计。不太清楚它返回空列表的原因,您应该查看生成的SQL集合hibernate属性show_SQL to true,看看哪里出错了。我没有亲自执行代码,因为JB Nizet没有更新他的awnser以匹配问题中发布的.java类。我只是将此awnser标记为正确。我不想让人们对与.java计算相关的解决方案感到困惑。JB Nizet负责正确的HQL解决方案,即使他的awnser引用了.java类中不存在的表和变量
Select distinct t 
from TrackItem item inner join item.track t 
where item.itemTime between 100L and 200L;
Session s = obtainSession();
Criteria c = s.createCriteria(Track.class);
DetachedCriteria dc = DetachedCriteria.forClass(TrackItem.class);

dc.setProjection(Property.forName("track"));
dc.add(Restrictions.between("itemTime", x, y));

c.add(Subqueries.propertyIn("id", dc))