質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Hibernate

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3485閲覧

Spring Boot アプリケーションでOracleに意図しないSQLが発行されてORA-00904エラーとなる

退会済みユーザー

退会済みユーザー

総合スコア0

Hibernate

HibernateとはJava言語のobject-relational mapping (ORM)ライブラリであり、Object/Relational Mappingよりはるか多くの方法でアプリケーションをPOJOで機能付けることができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2018/01/22 15:28

ご覧いただきありがとうございます。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Entityの定義が間違っているように見えます
結合してテーブルを取得する場合、JoinColumnで外部キーカラムを指定しましょう
以下のようにRoom.javaを変更してみてください

Room.java

java

1// ~~~~~~~~~~~~~~~~~~ 2 @JoinColumn(name = "owner_id", nullable = false) 3 @ManyToOne(cascade = CascadeType.ALL) 4 private User user; 5// ~~~~~~~~~~~~~~~~~~ 6 public User getUser() { 7 return user; 8 } 9 10 public void setUser(User user) { 11 this.user = user; 12 } 13// ~~~~~~~~~~~~~~~~~~ 14}

※ JoinColumnのname指定がない場合、外部キー名はプロパティ名 + 参照先の主キー名 となります
プロパティ名をownerとすれば、JoinColumnのname属性は不要となります

投稿2018/01/22 15:54

編集2018/01/22 15:56
snicmakino

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/23 15:38

できましたー! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問