根据标签获取图片

问题描述 投票:0回答:1

我有一个小爱好项目。目标是显示图像。对于每张图像,都有许多称为标签的子项。

我的问题是根据标签获取图像并创建日期。

我用的是

  • 玛丽亚Db,
  • 雄猫9
  • 休眠5.6.9.最终版

我有一个基于 java 的 REST 服务和一个 agular 前端。

这是我的两个实体。

@Entity
@Table(name = "image")
public class ImageEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "photoalbum_image_seq")
    @SequenceGenerator(name = "photoalbum_image_seq", sequenceName = "photoalbum_seq", allocationSize = 1)
    @Column(name = "id")
    private long id;

    @Column(name = "imageYear")
    private String imageYear;
    @Column(name = "imageMonth")
    private String imageMonth;
    @Column(name = "imageDay")
    private String imageDay;
    @Column(name = "imagePath")
    private String imagePath;
    @Column(name = "checksum")
    private String checksum;
    @Column(name = "createdate")
    private Date createdate;
    @Column(name = "mediatype")
    private String mediaType;

    @Column(name = "internetpath")
    private String internetpath;
    @Column(name = "longitude")
    private double longitude;
    @Column(name = "latitude")
    private double latitude;

    @OneToMany(mappedBy = "image", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<MetaEntity> metas = new LinkedList<>();

    @OneToMany(mappedBy = "image", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    private List<TagEntity> tags = new LinkedList<>();

    Getters and setters.
}
@Entity
@Table(name = "tag")
public class TagEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "photoalbum_tags_seq")
    @SequenceGenerator(name = "photoalbum_tags_seq", sequenceName = "photoalbum_seq", allocationSize = 1)
    @Column(name = "id")
    private long id;

    @Column(name = "value")
    private String value;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "image_id", nullable = false)
    private ImageEntity image;
    
    Getter and setters.

}

这是我的DDL


CREATE SEQUENCE photoalbum_seq START WITH 1 INCREMENT BY 1;

CREATE TABLE image(
  id bigint(20) NOT NULL AUTO_INCREMENT,
  imageYear varchar(4) NOT NULL,
  imageMonth varchar(2) NOT NULL,
  imageDay varchar(2) NOT NULL,
  imagePath varchar(512) NOT NULL,
  checksum varchar(128) NOT NULL,
  createdate date DEFAULT NULL,
  mediatype varchar(25) DEFAULT NULL,
  internetpath varchar(512) DEFAULT NULL,
  longitude DOUBLE DEFAULT NULL,
  latitude DOUBLE DEFAULT NULL,
    CONSTRAINT image_PK PRIMARY KEY (id)
) 
ENGINE=InnoDB
AUTO_INCREMENT=1 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_general_ci;


CREATE TABLE tag (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  image_id bigint(20) NOT NULL,
  value varchar(100) NOT NULL,
  CONSTRAINT tags_PK PRIMARY KEY (id)
) 
ENGINE=InnoDB 
AUTO_INCREMENT=621396 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_general_ci;

CREATE TABLE meta (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  image_id bigint(20) NOT NULL,
  metaKey varchar(100) NOT NULL,
  value varchar(100) NOT NULL,
  CONSTRAINT meta_PK PRIMARY KEY (id)
) 
ENGINE=InnoDB 
AUTO_INCREMENT=621396 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_general_ci;
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="PhotoalbumPU" transaction-type="RESOURCE_LOCAL">
        <!-- Persistence provider -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Entity classes -->
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"    value="jdbc:mariadb://localhost:3306/photoalbum" />
            <property name="javax.persistence.jdbc.user" value="******" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDB103Dialect"/>
            <property name="show_sql" value="true"/>
            <property name="javax.persistence.jdbc.password" value="*******"/>
            <!-- property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/ -->
            <!-- property name="hibernate.format_sql" value="true"/ -->
            <!-- property name="hibernate.use_sql_comments" value="true"/ -->
        </properties>
    </persistence-unit>
</persistence>
    public static List<ImageEntity> getimages(int count, Date startDate, Date endDate, String tag) {

        List<ImageEntity> res = em.createQuery(
                "select img from ImageEntity img join fetch img.tags t where  img.createdate > :start and t.value = 'v50'",
                ImageEntity.class).setParameter("start", startDate).getResultList();
        return res;

    }

我在谷歌上找到了很多结果,其中有一些解决方案。

“解决方案”之一如下。

https://itecnote.com/tecnote/java-hibernate-hql-query-to-get-parent-children-based-on-childid/

select p from Parent p join p.childList c
    where p.name = 'John' and c.favoriteColor = 'blue'

我将父级替换为 ImageEntity,子级替换为 TagEntity。

以下2个就可以了。

select img from ImageEntity img join fetch img.tags t where t.value = 'v50'

select img from ImageEntity img join fetch img.tags t where  img.createdate > :start

以下内容不起作用。

select img from ImageEntity img join fetch img.tags t where  img.createdate > :start and t.value = 'v50'

正如你所见,如果我只使用 1 个“标准”,它就有效。如果我两者都用,那就不行了。

我觉得我别无选择。

如果您有任何问题,我会尽力回答。

更新。

  • 我的数据库中有 666 张图像。
  • 我的数据库中有 1560 个标签。
  • 发送的日期是 1970-01-01,在我使用它之前它会被转换,在查询中使用它

使用以下 sql 我得到 1560 个结果。

select count(*) from image i 
inner join tag t 
on i.id = t.image_id;

使用以下 sql,我得到 44 个结果。

select count(*) from image i 
inner join tag t 
on i.id = t.image_id
where t.value = 'v50';

在调试时,使用以下 jql/hql 时,我得到 44 个结果

select img from ImageEntity img join fetch img.tags t where t.value = 'v50'

使用以下 jql/hql 我得到 707 个结果。

select img from ImageEntity img join fetch img.tags t where img.createdate > : start

使用以下 jql/hql 我得到一个空数组作为结果。

select img from ImageEntity img join fetch img.tags t where img.createdate  >: start

和以前一样,如果您需要更多信息,我会尽力为您提供更多信息。 如果可以的话我会上传完整的 src 和 pom。如果有人知道该怎么做,请告诉我。

java rest mariadb parent-child
1个回答
0
投票

如果两个查询都运行良好并且返回结果符合您的预期,那么问题肯定出在具有 2 个条件的最终查询中。

问题可能与:

  1. 没有比指定数据更年轻的标签

    v50
    的图像。只需在数据库中检查即可。

  2. 请注意,

    createdate
    还存储了日期的时间“hh:mm:ss”。并且可能您需要将
    :start
    日期重新设置为当天的开始,然后再将其传递给查询。

注意:如果您提供更多信息,帮助可能会更有用:)

© www.soinside.com 2019 - 2024. All rights reserved.