ご覧いただきありがとうございます。
Spring Boot でチャットアプリを作成しています。
/roomsにアクセスしてRoomRepository.findAllByOrderByIdDesc()メソッドを呼んで
select * from app.rooms order by id descを発行したかったのですが、
テーブル名と列名が意図しない変換をされて以下のようなエラーとなりました。
なぜこのように変換されてしまうのでしょうか。
よろしくお願いいたします。
2018-01-23 00:09:55.172 INFO 28016 --- [p-nio-80-exec-2] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory Hibernate: select room0_.id as id1_2_, room0_.owner_id_id as owner_id_id2_2_ from app.rooms room0_ order by room0_.id desc 2018-01-23 00:09:55.363 WARN 28016 --- [p-nio-80-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 904, SQLState: 42000 2018-01-23 00:09:55.363 ERROR 28016 --- [p-nio-80-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00904: "ROOM0_"."OWNER_ID_ID": invalid identifier 2018-01-23 00:09:55.374 ERROR 28016 --- [p-nio-80-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause oracle.jdbc.OracleDatabaseException: ORA-00904: "ROOM0_"."OWNER_ID_ID": invalid identifier
DDL
lang
1create table app.users ( 2 id number generated always as identity primary key, 3 name nvarchar2(32) not null, 4 password nvarchar2(32) not null); 5 6create table app.rooms ( 7 id number generated always as identity primary key, 8 owner_id number references app.users(id)); 9 10create table app.memberships ( 11 membership_id number generated always as identity primary key, 12 room_id number references app.users(id), 13 user_id number references app.rooms(id)); 14 15create table app.messages ( 16 id number generated always as identity primary key, 17 sender_id number references app.users(id), 18 room_id number references app.rooms(id), 19 text nvarchar2(256) not null, 20 created_at timestamp default systimestamp not null);
RoomsController.java
lang
1package com.springTalk.web; 2 3import java.util.List; 4 5import javax.servlet.http.HttpServletRequest; 6import javax.validation.Valid; 7 8import org.springframework.beans.factory.annotation.Autowired; 9import org.springframework.stereotype.Controller; 10import org.springframework.ui.Model; 11import org.springframework.validation.BindingResult; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.PostMapping; 14 15import com.springTalk.domain.Message; 16import com.springTalk.domain.Room; 17import com.springTalk.domain.User; 18import com.springTalk.service.MessageService; 19import com.springTalk.service.RoomService; 20import com.springTalk.service.UserService; 21 22@Controller 23public class RoomsController { 24 @Autowired 25 private UserService userService; 26 @Autowired 27 private RoomService roomService; 28 @Autowired 29 private MessageService messageService; 30 31 @GetMapping("/rooms") 32 public String roomsGet(Model model) { 33 List<Room> rooms = roomService.getRoomsOrderByIdDesc(); 34 model.addAttribute("room", rooms); 35 model.addAttribute("roomsForm", new RoomsForm()); 36 return "rooms"; 37 } 38 39 @PostMapping("/rooms") 40 public String roomsPost(Model model, @Valid RoomsForm roomsForm, BindingResult bindingResult, 41 HttpServletRequest request) { 42 if (bindingResult.hasErrors()) { 43 List<Room> rooms = roomService.getRoomsOrderByIdDesc(); 44 model.addAttribute("room", rooms); 45 model.addAttribute("roomsForm", new RoomsForm()); 46 return "rooms"; 47 } 48 49 // get dummy user 50 // ToDo: get user id from request 51 final Long OWNER_ID = 1L; 52 User user = userService.getUserById(OWNER_ID).get(0); 53 Room room = roomService.saveAndFlush(new Room(user)); 54 messageService.save(new Message(user, room, roomsForm.getText())); 55 return "redirect:/rooms"; 56 } 57}
RoomService.java
lang
1package com.springTalk.service; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7import org.springframework.transaction.annotation.Transactional; 8 9import com.springTalk.domain.Room; 10import com.springTalk.domain.RoomRepository; 11 12@Service 13public class RoomService { 14 15 @Autowired 16 private RoomRepository repository; 17 18 public List<Room> getRoomsOrderByIdDesc() { 19 return repository.findAllByOrderByIdDesc(); 20 } 21 22 public List<Room> getRoomsById(Long id) { 23 return repository.findById(id); 24 } 25 26 @Transactional 27 public void save(Room room) { 28 repository.save(room); 29 } 30 31 @Transactional 32 public Room saveAndFlush(Room room) { 33 return repository.saveAndFlush(room); 34 } 35}
RoomRepository.java
lang
1package com.springTalk.domain; 2 3import java.util.List; 4 5import org.springframework.data.jpa.repository.JpaRepository; 6import org.springframework.stereotype.Repository; 7 8@Repository 9public interface RoomRepository extends JpaRepository<Room, Long> { 10 List<Room> findAllByOrderByIdDesc(); 11 12 List<Room> findById(Long id); 13 14 // ToDo: find where userId and room pair is in membership 15 16}
Room.java
lang
1package com.springTalk.domain; 2 3import java.util.List; 4 5import javax.persistence.CascadeType; 6import javax.persistence.Entity; 7import javax.persistence.FetchType; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.ManyToOne; 13import javax.persistence.OneToMany; 14import javax.persistence.Table; 15 16@Entity 17@Table(name = "rooms", schema = "app") 18public class Room { 19 @Id 20 @GeneratedValue(strategy = GenerationType.AUTO) 21 private Long id; 22 23 @JoinColumn(nullable = false) 24 @ManyToOne(cascade = CascadeType.ALL) 25 private User ownerId; 26 27 @OneToMany(mappedBy = "roomId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 28 private List<Membership> memberships; 29 30 @OneToMany(mappedBy = "roomId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 31 private List<Message> messages; 32 33 // JPA requirement 34 protected Room() { 35 } 36 37 public Room(User ownerId) { 38 this.ownerId = ownerId; 39 } 40 41 public Long getId() { 42 return id; 43 } 44 45 public User getOwnerId() { 46 return ownerId; 47 } 48 49 public void setOwnerId(User ownerId) { 50 this.ownerId = ownerId; 51 } 52}
application.yml
lang
1spring: 2 jpa: 3 show-sql: true 4 properties: 5 hibernate: 6 connection: 7 characterEncoding: utf-8 8 CharSet: utf-8 9 useUnicode: true 10 datasource: 11 url: jdbc:oracle:thin:@localhost:1521:chatdb 12 username: app 13 password: password 14 driverClassName: oracle.jdbc.driver.OracleDriver 15 connectionProperties: useUnicode=true;characterEncoding=utf-8; 16server: 17 port: 80
環境
Spring Boot 1.5.9 RELEASE
Oracle VM VirtualBox 5.1.22 r115126 (Qt5.6.2)
CentOS 7.3.1611
openjdk version "1.8.0_141"
Oracle Database 12c Release 2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/23 15:38