我正在创建一个图书标签系统,并尝试调用所有具有相同标签的图书。我的查询只显示第一本书,而不是下面任何一本具有相同标签的书。
这是数据库的books表
drop table if exists books;
create table books (
isbn_13 varchar (13) primary key,
title varchar (100),
author varchar (80),
publish_date date,
price decimal (6,2),
content bytea
);
以下是数据库的book\u tags表:
CREATE TABLE book_tags
(
isbn_13 character varying(13) NOT NULL,
tag_names character varying(100) NOT NULL,
CONSTRAINT book_tags_pkey PRIMARY KEY (isbn_13, tag_names),
CONSTRAINT book_tags_isbn_13_fkey FOREIGN KEY (isbn_13)
REFERENCES public.books (isbn_13) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
下面是调用查询的booktagdaoimpl文件:
public List<Book> getBooksByTag(String tag) {
List<Book> books = new ArrayList<>();
try {
connection = DAOUtilities.getConnection();
String sql = "SELECT * FROM books INNER JOIN BOOK_TAGS ON tag_names=?";
stmt = connection.prepareStatement(sql);
stmt.setString(1, tag);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
Book book = new Book();
book.setIsbn13(rs.getString("isbn_13"));
book.setAuthor(rs.getString("author"));
book.setTitle(rs.getString("title"));
book.setPublishDate(rs.getDate("publish_date").toLocalDate());
book.setPrice(rs.getDouble("price"));
book.setContent(rs.getBytes("content"));
books.add(book);
}
System.out.println("seeing if it will pull multiple books from one tag" + books);
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeResources();
}
return books;
}
2条答案
按热度按时间j9per5c41#
作为开门红
if
声明应该是while
改为循环。但是,这也是您的查询的一个问题:
这两个表之间缺少一个连接条件,因此只要其中至少有一个具有searched标记,它就基本上返回所有图书。大概你想要:
你不妨用
EXISTS
:lo8azlld2#
连接语法不是这样工作的。我想你的意思是
因为它是一个内部连接,所以你不会得到任何没有匹配标签行的书。
您还有另一个问题,因为很难找到单个标记或标记的子集,因为您需要这样做
where tag_names like '%value%'
. 每个标记记录应该有一个标记。