2017-01-24 15 views
0

私は使用しようとしています... ContainingIgnoreCase JPAクエリーを使用して、profile(id)、profile_interest(profile_idとinterest_id)、interest(id)という3つの関連オブジェクトから情報を抽出します。私のサービスでContainingIgnoreCase Hibernate JPAエラー

私は パブリッククラスSearchService @Service

呼び出す{

@Autowired 
private ProfileDao profileDao; 


public List<SearchResult> search(String text) { 
    return profileDao.findByInterestsNameContainingIgnoreCase(text).stream().map(SearchResult::new).collect(Collectors.toList()); 
} 

}

はその後、私のDAOはそれを実行します。

ブロックを

package music.bolo.domain.entity; 

import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.Set; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.ManyToMany; 
import javax.persistence.OneToOne; 
import javax.persistence.OrderColumn; 
import javax.persistence.Table; 

import org.owasp.html.PolicyFactory; 

import music.bolo.domain.dto.FileInfo; 

@Entity 
@Table(name = "profile") 
public class Profile { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @OneToOne(targetEntity = Usuario.class) 
    @JoinColumn(name = "user_id", nullable = false) 
    private Usuario usuario; 

    @Column(name = "about", length = 5000) 
    private String about; 

    @Column(name = "photo_directory", length = 10) 
    private String photoDirectory; 

    @Column(name = "photo_name", length = 10) 
    private String photoName; 

    @Column(name = "phot_extension", length = 5) 
    private String photoExtension; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "profile_interests", joinColumns = { @JoinColumn(name = "profile_id") }, inverseJoinColumns = { 
      @JoinColumn(name = "interest_id") }) 
    @OrderColumn(name = "display_order") 
    private Set<Interest> interests; 

    public Profile() { 
    } 

    public Profile(Usuario usuario) { 
     this.usuario = usuario; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public Usuario getUsuario() { 
     return usuario; 
    } 

    public void setUsuario(Usuario usuario) { 
     this.usuario = usuario; 
    } 

    public String getAbout() { 
     return about; 
    } 

    public void setAbout(String about) { 
     this.about = about; 
    } 

    public String getPhotoDirectory() { 
     return photoDirectory; 
    } 

    public void setPhotoDirectory(String photoDirectory) { 
     this.photoDirectory = photoDirectory; 
    } 

    public String getPhotoName() { 
     return photoName; 
    } 

    public void setPhotoName(String photoName) { 
     this.photoName = photoName; 
    } 

    public String getPhotoExtension() { 
     return photoExtension; 
    } 

    public void setPhotoExtension(String photoExtension) { 
     this.photoExtension = photoExtension; 
    } 

    // Create a profile that is suitable for displaying via JSP 
    public void safeCopyFrom(Profile other) { 
     if (other.about != null) { 
      this.about = other.about; 
     } 
     if (other.interests != null) { 
      this.interests = other.interests; 
     } 
    } 

    // Create a profile sanitized for saving 
    public void safeMergeFrom(Profile webProfile, PolicyFactory htmlPolicy) { 

     if (webProfile.about != null) { 
      this.about = htmlPolicy.sanitize(webProfile.about); 
     } 
    } 

    public void setPhotoDetails(FileInfo info) { 

     photoDirectory = info.getSubDirectory(); 
     photoExtension = info.getExtension(); 
     photoName = info.getBasename(); 
    } 

    public Path getPhoto(String baseDirectory) { 
     if (photoName == null) { 
      return null; 
     } 
     return Paths.get(baseDirectory, photoDirectory, photoName + "." + photoExtension); 
    } 

    public Set<Interest> getInterests() { 
     return interests; 
    } 

    public void setInterests(Set<Interest> interests) { 
     this.interests = interests; 
    } 

    public void addInterest(Interest interest) { 
     interests.add(interest); 
    } 

    public void removeInterest(String interestName) { 
     interests.remove(new Interest(interestName)); 
    } 

    @Override 
    public String toString() { 
     return "Profile [id=" + id + ", usuario=" + usuario + ", about=" + about + ", photoDirectory=" + photoDirectory 
       + ", photoName=" + photoName + ", photoExtension=" + photoExtension + ", interests=" + interests + "]"; 
    } 

} 

しかし...私はこれを取得:ProfileDaoはCrudRepository {

Profile findByUsuario(Usuario usuario); 

List<Profile> findByInterestsNameContainingIgnoreCase(String text); 

}

マイプロファイルオブジェクトを拡張@Repository引用 公開インタフェースエラー

2017年1月24日22:06:38.357 INFO 4656 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean:永続ユニット 'デフォルト' のためのJPAのEntityManagerFactoryを閉じる 2017年1月24日22:06:38.389 INFO 4656 - - [restartedMain] o.apache.catalina.core.StandardService:サービスTomcatを停止する 2017-01-24 22:06:38.404 WARN 4656 --- [ost-startStop-1] oacloader.WebappClassLoaderBase:Webアプリケーション[ROOT ]が[Abandoned connection cleanup thread]という名前のスレッドを開始したように見えますが、停止に失敗しました。これはメモリリークを引き起こす可能性が非常に高いです。スレッドのスタックトレース: java.lang.Object.wait(ネイティブメソッド) java.lang.ref.ReferenceQueue.remove(不明なソース) com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43) 2017 -01-24 22:06:38.420 ERROR 4656 --- [restartedMain] osboot.SpringApplication:アプリケーションの起動に失敗しました。

org.springframework.beans.factory.BeanCreationException:名前が 'indexController'のBeanを作成中にエラーが発生しました: autowired依存関係は失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドをautowireできませんでした:private music.bolo.services.ProfileService music.bolo.controllers.IndexController.profileService;ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです: 'profileService'という名前のBeanを作成中にエラーが発生しました:autowired依存関係の注入が失敗しました。入れ子にされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドをautowireできませんでした:music.bolo.domain.repository.ProfileDao music.bolo.services.ProfileService.profileDao;ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです: 'profileDao'という名前のBeanを作成中にエラーが発生しました:initメソッドの呼び出しに失敗しました。入れ子にされた例外はjava.lang.IllegalStateExceptionです:パス型を間接参照しようとする試みが間違っています の基本型のパス・ソースを無効にしようとしました。 -4.2.4.RELEASE.jar:4.2.4。RELEASE]

+0

があなたのプロフィールのマッピングファイルを追加する拡張

パブリックインターフェイス。完全なスタックトレースもありますか? –

答えて

0

私はDAOのネイティブクエリを使用して、それを解く:

パッケージmusic.bolo.domain.repository。

import java.util.List;

import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository;

import music.bolo.domain.entity.Profile; ProfileDaoQueryがCrudRepository {

@Query(value = "SELECT * FROM profile " 
     + "INNER JOIN profile_interests ON profile.id = profile_interests.profile_id" 
     + " INNER JOIN interests ON profile_interests.interest_id=interests.id " 
     + "WHERE interests.interest_name like %?1%", nativeQuery = true) 
List<Profile> findByInterestNames(String text); 

}

+0

これも動作します:https://stackoverflow.com/questions/33792288/springdatajpa-multiple-containingignorecase – Mike