2013-12-12 15 views
5

Tôi có thể nhận được cú pháp đúng cho truy vấn jpa đối với cơ sở dữ liệu. Nó hoạt động hoàn toàn tốt bằng cách sử dụng SQL sóc.Định dạng đúng của truy vấn sql trong java

Cơ sở dữ liệu là Derby và mã đang sử dụng JPA.

Đã cập nhật với truy vấn và lỗi mới. Điều này khiến tôi tin rằng đó là điều gì đó trong ánh xạ thực thể không chính xác. Nó có thể là một cái gì đó trong mệnh đề joinColumn?

Đã sửa lỗi đặt tên. đã gây ra vấn đề đầu tiên khi không sử dụng đúng tên thực thể.

Query q = em.createQuery("select t, sum(t.result) from Serie t, Player p " + 
     " where p.id = t.player" + 
     " group by t.player"); 

Exception [EclipseLink-6076] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.QueryException 
Exception Description: Object comparisons can only be used with OneToOneMappings. Other mapping comparisons must be done through query keys or direct attribute level comparisons. 
Mapping: [org.eclipse.persistence.mappings.DirectToFieldMapping[id-->PLAYER.ID]] 
Expression: [ 
Query Key id 
    Base com.jk.hcp.Player] 
Query: ReportQuery(referenceClass=Serie jpql="select t, sum(t.result) from Serie t, Player p where p.id = t.player group by t.player") 
    org.eclipse.persistence.exceptions.QueryException.unsupportedMappingForObjectComparison(QueryException.java:1164) 

Đối tượng

public class Player implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 



    private String name; 
    private static final long serialVersionUID = 1L; 

    public Player() { 
     super(); 
    } 

    public Long getId() { 
     return this.id; 
    } 

    /* 
    public void setId(Long id) { 
     this.id = id; 
    } 
    */ 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "clubId", referencedColumnName = "id") 
    private Club club; 

    public Club getClub() { 
     return club; 
    } 
    public void setClub(Club club) { 
     this.club = club; 
    } 

    @Override 
    public String toString() { 
     return this.name; 
    } 
} 

public class Serie implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private int result; 
    private static final long serialVersionUID = 1L; 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date serieDate; //java.util.Date 

    /*** 
    * Convert back and forth between string and date. 
    * @return 
    */ 
    public String getSerieDate() 
    { 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String mDate = ""; 
     System.out.println(serieDate); 
     try { 
      mDate = df.format(serieDate); 
     } 
     catch (Exception ex) { 
      //ex.printStackTrace(); 
     } 

     return mDate; 
    } 

    public void setSerieDate(String aTime) { 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     try { 
      Date d = df.parse(aTime); 
      serieDate = d; 
     } 
     catch (java.text.ParseException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public Serie() { 
     super(); 
    } 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
    public int getResult() { 
     return this.result; 
    } 

    public void setResult(int result) { 
     this.result = result; 
    } 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "clubId", referencedColumnName = "id") 
    private Club club; 

    public Club getClub() { 
     return club; 
    } 
    public void setClub(Club club) { 
     this.club = club; 
    } 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "playerId", referencedColumnName = "id") 
    private Player player; 

    public Player getPlayer() { 
     return this.player; 
    } 
    public void setPlayer(Player player) { 
     this.player = player; 
    } 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "serieTypeId", referencedColumnName = "id") 
    private SerieType serieType; 

    public SerieType getSerieType() { 
     return this.serieType; 
    } 
    public void setSerieType(SerieType serieType) { 
     this.serieType = serieType; 
    } 

} 




public List getSeriesForPlayer(String clubName, String playerName) 
{ 

    if (factory == null) { 
     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
    } 

    EntityManager em = factory.createEntityManager(); 

    Query q = em.createQuery("select sum(result) as total, avg(result) as snitt, s.SERIEDATE, p.NAME, c.NAME " + 
    " from jocke.serie s, jocke.player p, jocke.CLUB c" + 
    " where s.PLAYERID = p.ID" + 
    " and s.CLUBID = c.ID" + 
    " and c.NAME = '" + "BK Strået" + "'" + 
    " and p.NAME = '" + "Jocke" + "'" + 
    " group by p.name, s.SERIEDATE, c.NAME"); 

    List resultList = q.getResultList(); 
    Object obj = resultList.get(0); 

    em.close(); 

    return resultList; 
} 

xception Description: Syntax error parsing [select sum(result) as total, avg(result) as snitt, s.SERIEDATE, p.NAME, c.NAME from jocke.serie s, jocke.player p, jocke.CLUB c where s.PLAYERID = p.ID and s.CLUBID = c.ID and c.NAME = 'BK Strået' and p.NAME = 'Jocke' group by p.name, s.SERIEDATE, c.NAME]. 
[11, 17] The encapsulated expression is not a valid expression. 
+0

Có vẻ không phải là vấn đề. Tôi bắt đầu nghĩ rằng nó có cái gì đó để làm với ánh xạ thực thể. – user2130951

+0

Bạn đã thử sử dụng số nhận dạng java (chữ thường như trong lớp) cho p.ID = t.PLAYERID? – stacker

+0

Xem ngoại lệ mới khi đã được khắc phục. – user2130951

Trả lời

3

Trong truy vấn JPA bạn phải sử dụng tên tài sản của Entities. Vì vậy, không sử dụng ID và PLAYER, nhưng idplayer.

Tôi nghĩ rằng một cái gì đó như thế này nên làm việc:

Query q = em.createQuery("select t, sum(t.result) from Serie t, Player p " + 
         "  where p = t.player" + 
         "  group by t.player"); 
+0

Đó là kết luận tôi cũng đã đến. Nhưng có vẻ như có một vấn đề khác. Xem thêm thông tin liên quan đến thông báo lỗi. Mô tả ngoại lệ: So sánh đối tượng chỉ có thể được sử dụng với OneToOneMappings. Các so sánh ánh xạ khác phải được thực hiện thông qua các khóa truy vấn hoặc so sánh mức thuộc tính trực tiếp. Lập bản đồ: [org.eclipse.persistence.mappings.DirectToFieldMapping [id -> PLAYER.ID]] – user2130951

+0

Ah vâng, bạn so sánh id của trình phát với thực thể trình phát mà tôi nghĩ. Xem phản hồi được cập nhật của tôi. –

Các vấn đề liên quan