簡體   English   中英

JPA查詢SELECT不起作用

[英]JPA queries SELECT is not working

我遇到以下問題,我希望我的應用程序列出數據庫中的所有Weapons 這是getDbWeapons方法:

 public ArrayList<Weapon> getDbWeapons()
    {
        ArrayList<Weapon> dbWeapons = new ArrayList<>();
        EntityTransaction entr=em.getTransaction();
            entr.begin();
        Query query = em.createQuery("SELECT i FROM Weapon i", Weapon.class);
        query.setParameter("itemid", dbWeapons);
        dbWeapons = (ArrayList<Weapon>) query.getResultList();
        em.getTransaction().commit();

        /*
        Stáhne všechny zbraně ze serveru a vrátí je jako ArrayList.
        Nezapomeň při vkládání doplnit parametr Item.type!
        */
        return dbWeapons;
    }

這是我的Armor等級:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dke.ps.Tables;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author michal
 */
@Entity
@Table(name = "armor")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Armor.findAll", query = "SELECT a FROM Armor a")
    , @NamedQuery(name = "Armor.findByItemid", query = "SELECT a FROM Armor a WHERE a.itemid = :itemid")
    , @NamedQuery(name = "Armor.findByName", query = "SELECT a FROM Armor a WHERE a.name = :name")
    , @NamedQuery(name = "Armor.findByValue", query = "SELECT a FROM Armor a WHERE a.value = :value")
    , @NamedQuery(name = "Armor.findByDescription", query = "SELECT a FROM Armor a WHERE a.description = :description")
    , @NamedQuery(name = "Armor.findByIcon", query = "SELECT a FROM Armor a WHERE a.icon = :icon")
    , @NamedQuery(name = "Armor.findByType", query = "SELECT a FROM Armor a WHERE a.type = :type")
    , @NamedQuery(name = "Armor.findByDefence", query = "SELECT a FROM Armor a WHERE a.defence = :defence")
    , @NamedQuery(name = "Armor.findByPrice", query = "SELECT a FROM Armor a WHERE a.price = :price")})
public class Armor implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "itemid")
    private Integer itemid;
    @Column(name = "name")
    private String name;
    @Column(name = "value")
    private Integer value;
    @Column(name = "description")
    private String description;
    @Column(name = "icon")
    private String icon;
    @Column(name = "type")
    private Integer type;
    @Column(name = "defence")
    private Integer defence;
    @Column(name = "price")
    private Integer price;
    @JoinColumn(name = "itemid", referencedColumnName = "id", insertable = false, updatable = false)
    @OneToOne(optional = false)
    private ItemsId itemsId;

    public Armor() {
    }

    public Armor(Integer itemid) {
        this.itemid = itemid;
    }

    public Integer getItemid() {
        return itemid;
    }

    public void setItemid(Integer itemid) {
        this.itemid = itemid;
    }

    public String getName() {
        return name;
    }

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

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public String getDescription() {
        return description;
    }

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

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public Integer getDefence() {
        return defence;
    }

    public void setDefence(Integer defence) {
        this.defence = defence;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public ItemsId getItemsId() {
        return itemsId;
    }

    public void setItemsId(ItemsId itemsId) {
        this.itemsId = itemsId;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (itemid != null ? itemid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Armor)) {
            return false;
        }
        Armor other = (Armor) object;
        if ((this.itemid == null && other.itemid != null) || (this.itemid != null && !this.itemid.equals(other.itemid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.dke.ps.Tables.Armor[ itemid=" + itemid + " ]";
    }

}

這是我的Shop類,其中應顯示以下項目:

package com.dke.ps.Shop;

import static com.dke.ps.Constants.Constants.*;
import com.dke.ps.CustomTypes.ImagePanel;
import com.dke.ps.Items.Armor;
import com.dke.ps.Items.Item;
import com.dke.ps.Items.Potion;
import com.dke.ps.Items.Weapon;
import com.dke.ps.Server.*;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import net.miginfocom.swing.MigLayout;

/**
 * Class implementing in-app-purchaces (microtransactions).
 * @author vitvalecka
 */
public class Shop extends JFrame implements ListSelectionListener
{
    private Server server;
    private User user;

    private JPanel panelShop;
    private JPanel panelItemDetail;
    private JPanel panelItemList;
    private JScrollPane spItemListScroll;

    private JList listItems;
    private DefaultListModel dlmItems = new DefaultListModel();
    private JButton btnBuy = new JButton("Buy");
    private JLabel lItemName = new JLabel();
    private ImagePanel ipItemImage;
    private JLabel lPrice = new JLabel();
    private JLabel lEffect = new JLabel();
    private JLabel lBought = new JLabel();
    private JButton btnReloadShop = new JButton("Reload Shop");

    private JPanel panelShopAdminButtons;
    private JButton btnAddItem = new JButton("Add");
    private JButton btnEditItem = new JButton("Edit");
    private JButton btnDeleteItem = new JButton("Delete");

    private ArrayList<Item> listOfDbItems = new ArrayList<>();
    private ArrayList<Integer> listOfUsersItems = new ArrayList<>();

    /**
     * Shop window initialization.
     * @param server    database server to connect
     * @param user      user entering the store
     */
    public Shop(Server server, User user)
    {
        super();
        this.server = server;
        this.user = user;

        init();
    }

    private void init()
    {
        dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
        setResizable(false);
        setTitle("Shop");
        setSize(SHOP_SIZE_X, SHOP_SIZE_Y);

        panelShop = new JPanel();
        setContentPane(panelShop);
        panelShop.setLayout(new MigLayout("", "[grow, fill]"));

        panelItemDetail = new JPanel();
        panelItemDetail.setLayout(new MigLayout(
                "wrap",
                "[grow, fill]"
        ));

        panelItemDetail.add(lItemName);
        panelItemDetail.add(lPrice);
        panelItemDetail.add(lEffect);
        panelItemDetail.add(lBought);
        panelItemDetail.add(btnBuy);
        btnBuy.addActionListener((e)->{
            buy();
        });

        if ((user.getUsername() == SHOP_ADMIN_USERNAME) && (user.isLoginOk()))
        {
            panelShopAdminButtons = new JPanel();
            panelShopAdminButtons.setLayout(new MigLayout("", "[grow, fill]"));
            panelShopAdminButtons.add(btnAddItem);
            panelShopAdminButtons.add(btnEditItem);
            panelShopAdminButtons.add(btnDeleteItem);

            btnAddItem.addActionListener((e)->{
                new AddEditItem(server, null);
            });

            btnEditItem.addActionListener((e)->{
                if (getSelectedItem() != null)
                {
                    new AddEditItem(server, getSelectedItem());
                }
            });

            btnDeleteItem.addActionListener((e)->{
                if (getSelectedItem() != null)
                {
                    server.removeItemFromDb(getSelectedItem().id);
                }
            });
        }

        panelItemList = new JPanel();
        panelItemList.setLayout(new MigLayout(
                "wrap",
                "[grow, fill]"
        ));

        loadItems();
        listItems = new JList(dlmItems);
        spItemListScroll = new JScrollPane(listItems);
        panelItemList.add(spItemListScroll);
        listItems.addListSelectionListener(this);
        listItems.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listItems.setLayoutOrientation(JList.VERTICAL);
        listItems.setVisibleRowCount(VISIBLE_ITEMS);
        panelItemList.add(btnReloadShop);
        btnReloadShop.addActionListener((e)->{
            loadItems();
        });

        panelShop.add(panelItemList);

        ipItemImage = new ImagePanel("");
        String formatingString = "height " + ITEM_IMAGE_SIZE + ":" + ITEM_IMAGE_SIZE + ":" + ITEM_IMAGE_SIZE;
        panelItemList.add(ipItemImage, formatingString);

        panelItemList.add(panelItemDetail);

        btnReloadShop.addActionListener((e)->{loadItems();});

        setFocusableWindowState(false);
        setVisible(true);
        setFocusableWindowState(true);
    }

    private void loadItems()
    {
        listOfDbItems = server.getDbItems();
        listOfUsersItems = server.getPurchasedItems(user);
        dlmItems.clear();

        int numberOfItemsInDb = listOfDbItems.size();

        for (int i = 0; i < numberOfItemsInDb; i++)
        {
            dlmItems.addElement((listOfDbItems.get(i)).name);
        }
    }

    private void buy()
    {
        int selectedIndex = listItems.getSelectedIndex();
        int selectedItemId = (listOfDbItems.get(selectedIndex)).id;
        server.purchaseItem(user, selectedItemId);
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting() == false)
        {
            int selectedIndex = listItems.getSelectedIndex();

            if (selectedIndex >= 0)
            {

                Item selectedItem = listOfDbItems.get(selectedIndex);

                lItemName.setText(selectedItem.name);
                ipItemImage = new ImagePanel(selectedItem.icon);  
                lPrice.setText("Price: " + selectedItem.price);

                if (instancesInInventory(selectedItem) > 0)
                {
                    lBought.setText(
                            "You have already bought " +
                            instancesInInventory(selectedItem) +
                            " pieces."
                    );
                }
                else
                {
                    lBought.setText("You have not bought this item yet.");
                }

                switch (selectedItem.type) {
                    case WEAPON_ID:
                    {
                        lEffect.setText("Power: " + ((Weapon)selectedItem).power);
                        break;
                    }
                    case ARMOR_ID:
                    {
                        lEffect.setText("Defence: " + ((Armor)selectedItem).defence);
                        break;
                    }
                    case POTION_ID:
                    {
                        lEffect.setText("Heals " + ((Potion)selectedItem).healRate + " points of health");
                        break;
                    }
                    default:
                        break;

                }
            }
        }
    }

    private int instancesInInventory(Item selectedItem)
    {
        int numberOfInstances = 0;

        for (int i = 0; i < listOfUsersItems.size(); i++)
        {
            if (selectedItem.id == listOfUsersItems.get(i))
            {
                numberOfInstances++;
            }
        }

        return numberOfInstances;
    }

    private Item getSelectedItem()
    {
        int selectedIndex = listItems.getSelectedIndex();
        if (selectedIndex >= 0)
            {
                return listOfDbItems.get(selectedIndex);
            }
        return null;
    }
}

您能幫我解決這個問題嗎? 非常感謝!

如果您希望獲取所有“ Weapon條目,那么我不知道您為什么要嘗試設置查詢參數。 還使用接口代替具體的實現:

public List<Weapon> getDbWeapons()
{
    List<Weapon> dbWeapons = new ArrayList<>();
    EntityTransaction entr=em.getTransaction();
        entr.begin();
    TypedQuery<Weapon> query = em.createQuery("SELECT i FROM Weapon i", Weapon.class);
    dbWeapons = query.getResultList();
    em.getTransaction().commit();

    return dbWeapons;
}

TypedQuery使用TypedQuery

如果要使用查詢參數,則需要在語句中指定它:

TypedQuery<Weapon> query = em.createQuery("SELECT i FROM Weapon i where itemType = :itemType", Weapon.class);
query.setParameter("itemType", "iron");
dbWeapons = query.getResultList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM