CrudRepository czy da sie wywolac w jakis sposob dziwaczne SQL query

0

Czesc, jako ze czesto backendem sie nie zajmuje to i takie rzeczy czesto spedzaja mi sen z powiek.

W kazdym razie musialem sie dobrac do bazy danych moodla. tam sporo dziwnych rzeczy. Generalnie potrzebuje powyciagac rozne rzeczy z roznych tabel, sqlka wyglada mniej wiecej tak:

SELECT cm.section,cs.name,cs.summary,mdf.name, mdc.content
FROM mdl_course AS cr
   JOIN mdl_course_modules AS cm
   JOIN mdl_data AS d
   JOIN mdl_data_fields AS mdf
   JOIN mdl_data_content AS mdc
   JOIN mdl_course_sections AS cs
WHERE cr.id=cm.course
      AND cm.module = 6
      AND cm.instance=mdf.dataid
      AND mdf.id=mdc.fieldid
      AND cs.id=cm.section

powiedzmy ze to nie wszystko ale duza czesc tego co chce osiagnac. Wyciaganie tego przez standartowe Springowe CrudRepository to taka troche sztuka bo trzeba odpytywac 5 czy 6 tabeli po kolei to co tu zrobilem 1 sql-ka (podpowiedz w moodle bazie danych nie ma zadnych relacji tylko czyste idki w kolumnach)

czy sa sie zrobic taki myk lub cos w tym stylu:


public interface CourseRepository extends CrudRepository<MdlCourse,Long> {

    @Modifying
    @Query("SELECT cm.section,cs.name,cs.summary,mdf.name, mdc.content\n" +
            "FROM mdl_course AS cr\n" +
            "   JOIN mdl_course_modules AS cm\n" +
            "   JOIN mdl_data AS d\n" +
            "   JOIN mdl_data_fields AS mdf\n" +
            "   JOIN mdl_data_content AS mdc\n" +
            "   JOIN mdl_course_sections AS cs\n" +
            "WHERE cr.id=cm.course\n" +
            "      AND cm.module = 6\n" +
            "      AND cm.instance=mdf.dataid\n" +
            "      AND mdf.id=mdc.fieldid\n" +
            "      AND cs.id=cm.section\n"+
            " AND  cr.id= :courseId")
    List<TutajMojFancyObiektKtoryMaWszystkiePotrzebneKolumny> getCourses(@Param("courseId") long courseId);
}

z gory dzieki

pzdr
Wojtek

1

SQL z new.
select new CustomerDto(c.firstName,c.lastName) FROM CUSTOMER c

0

dostaje

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException:mdl_course is not mapped [SELECT new Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.content)

wiec albo ja cos skopalem albo to nie tak sie robi ;P

Edit: z tym se juz poradzilem , jak ktos pokaze jak w HQL zrobic joiny :)

Edit2: dobra musze dolozyc relacje do bazy danych. to strasznie upierdliwe. nie wiem czy bedzie mi sie to chcialo robic. raczej pojade po odpytywaniu posczegolnych obiektow bez SQL bo nie chce mi sie dokladac relacji do 359 tabel

0

Hmm no właśnie nie powinien krzyczeć, że nie ma zmapowanej tabeli/relacji bo robisz to wszystko SQL.

0

jak jest tak

public interface CourseRepository extends CrudRepository<MdlCourse, Long> {
    @Modifying
    @Query("SELECT new elearningapi.model.dto.Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.content)\n" +
            "   FROM MdlCourse AS cr\n" +
            "   JOIN MdlCourseModules AS cm\n" +
            "   JOIN MdlData AS d\n" +
            "   JOIN MdlDataFields AS mdf\n" +
            "   JOIN MdlDataContent AS mdc\n" +
            "   JOIN MdlCourseSections AS cs\n" +
            "WHERE cr.id=cm.course\n" +
            "      AND cm.module = 6\n" +
            "      AND cm.instance=mdf.dataid\n" +
            "      AND mdf.id=mdc.fieldid\n" +
            "      AND cs.id=cm.section\n" +
            " AND  cr.id= :courseId")
List<Sessions> sessions(@Param("courseId") long courseId);
}

dostaje cos takiego

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT new elearningapi.model.dto.Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.content)
   FROM elearningapi.model.entity.course.MdlCourse AS cr
   JOIN MdlCourseModules AS cm
   JOIN MdlData AS d
   JOIN MdlDataFields AS mdf
   JOIN MdlDataContent AS mdc
   JOIN MdlCourseSections AS cs

a przy takim ukladzie

@Modifying
    @Query("SELECT new elearningapi.model.dto.Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.content)\n" +
            "   FROM mdl_course AS cr\n" +
            "   JOIN mdl_course_module AS cm\n" +
            "   JOIN mdl_data AS d\n" +
            "   JOIN mdl_data_fields AS mdf\n" +
            "   JOIN mdl_data_content AS mdc\n" +
            "   JOIN mdl_course_sections AS cs\n" +
            "WHERE cr.id=cm.course\n" +
            "      AND cm.module = 6\n" +
            "      AND cm.instance=mdf.dataid\n" +
            "      AND mdf.id=mdc.fieldid\n" +
            "      AND cs.id=cm.section\n" +
            " AND  cr.id= :courseId")

    List<Sessions> sessions(@Param("courseId") long courseId);

dostaje

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: mdl_course is not mapped [SELECT new elearningapi.model.dto.Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.content)
   FROM mdl_course AS cr
   JOIN mdl_course_module AS cm
   JOIN mdl_data AS d
   JOIN mdl_data_fields AS mdf
   JOIN mdl_data_content AS mdc
   JOIN mdl_course_sections AS cs

dodam tylko ze wszystko siedzie w spring boot jezeli ma to jakies znaczenie

1

No tak ale to jest traktowane jako HQL dodaj do adnotacji nativeQuery=true

0

EDIT: czysta sql zwracala mi bledy ze sa te same pola typu id itp. Jezeli dopisze jednak cs.id as sectionID to nie chce tego przyjac do konstruktora :(

Jeszcze jak dasz rade z jedna rzecza pomoc

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.model.dto.Sessions(cr.id,cs.id,cs.section,cs.name,cs.summary,mdf.name,mdc.conte' at line 1

tu kod mojego dto

package elearningapi.model.dto;

/**
 * Created by wojtek on 10/6/15.
 */
public class Sessions {

    private long courseId,sectionId;

    private long queue;

    private String title;

    private String description;

    private String databaseField;

    private String databaseValue;

    //                    (cr.id,           cs.id,      cs.section,     cs.name,         cs.summary,         mdf.name,               mdc.content)

    public Sessions(){

    }
    public Sessions(long courseId, long sectionId,      long queue,      String title, String description, String databaseField, String databaseValue) {
        this.courseId = courseId;
        this.sectionId = sectionId;
        this.queue = queue;
        this.title = title;
        this.description = description;
        this.databaseField = databaseField;
        this.databaseValue = databaseValue;
    }


    public long getCourseId() {
        return courseId;
    }

    public void setCourseId(long courseId) {
        this.courseId = courseId;
    }

    public long getSectionId() {
        return sectionId;
    }

    public void setSectionId(long sectionId) {
        this.sectionId = sectionId;
    }

    public long getQueue() {
        return queue;
    }

    public void setQueue(long queue) {
        this.queue = queue;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDatabaseField() {
        return databaseField;
    }

    public void setDatabaseField(String databaseField) {
        this.databaseField = databaseField;
    }

    public String getDatabaseValue() {
        return databaseValue;
    }

    public void setDatabaseValue(String databaseValue) {
        this.databaseValue = databaseValue;
    }
}
1

MOżliwe ze ten gamoń nie ogarnie new w SQL :-(. Wtedy zwróc po prostu sobie tablice Object[][] ewentualnie transformer ale to już nie wiem jak przez Spring JPA do tego się dobrać

http://stackoverflow.com/questions/3937131/getting-result-set-into-dto-with-native-sql-query-in-hibernate

0

Dokladnie to tak to trzeba zrobic. metoda prob i bledow, przy nativeQuery nie mozna dac new, on sam sobie mapuje

Dzieki @Szczery za pomoc ponizej kod jakby ktos potrzebowal na przyszlosc

  @Modifying
    @Query( value="SELECT cr.id as courseid,cs.id as sectionId,cs.section,cs.name as title,cs.summary,mdf.name as datafield,mdc.content" +
            "   FROM mdl_course AS cr\n" +
            "   JOIN mdl_course_modules AS cm\n" +
            "   JOIN mdl_data AS d\n" +
            "   JOIN mdl_data_fields AS mdf\n" +
            "   JOIN mdl_data_content AS mdc\n" +
            "   JOIN mdl_course_sections AS cs\n" +
            "WHERE cr.id=cm.course\n" +
            "      AND cm.module = 6\n" +
            "      AND cm.instance=mdf.dataid\n" +
            "      AND mdf.id=mdc.fieldid\n" +
            "      AND cs.id=cm.section\n" +
            " AND  cr.id= :courseId",nativeQuery = true)

    List<Sessions> sessions(@Param("courseId") long courseId);

tylko zwraca tablice obiektow. Moze jest jakis madry sposob zeby jednak to zrobic od razu, jak wynajde to napisze

1 użytkowników online, w tym zalogowanych: 0, gości: 1